Use Codable with Firebase
This library helps you to use your custom types that conform to Codable
protocol with Firebase. Here’s an example of a custom model:
struct Model: Codable {
enum MyEnum: Int, Codable {
case one, two, three
}
let stringExample: String
let booleanExample: Bool
let numberExample: Double
let dateExample: Date
let arrayExample: [String]
let optionalExample: Int?
let objectExample: [String: String]
let myEnumExample: MyEnum
}
This is how you would use the library with Firebase Realtime Database:
import Firebase
import CodableFirebase
let model: Model // here you will create an instance of Model
let data = try! FirebaseEncoder().encode(model)
Database.database().reference().child("model").setValue(data)
And here is how you would read the same value from Firebase Realtime Database:
Database.database().reference().child("model").observeSingleEvent(of: .value, with: { snapshot in
guard let value = snapshot.value else { return }
do {
let model = try FirebaseDecoder().decode(Model.self, from: value)
print(model)
} catch let error {
print(error)
}
})
This is how you would encode a model with Firebase Cloud Firestore:
import Firebase
import CodableFirebase
let model: Model // here you will create an instance of Model
let docData = try! FirestoreEncoder().encode(model)
Firestore.firestore().collection("data").document("one").setData(docData) { error in
if let error = error {
print("Error writing document: \(error)")
} else {
print("Document successfully written!")
}
}
And this is how you would decode the same model with Firebase Cloud Firestore:
Firestore.firestore().collection("data").document("one").getDocument { document, error in
if let document = document {
let model = try! FirestoreDecoder().decode(Model.self, from: document.data())
print("Model: \(model)")
} else {
print("Document does not exist")
}
}
GeoPoint
, DocumentRefence
, FieldValue
, Timestamp
in Cloud FirestoreIn order to use these types with Cloud Firestore, you need to add the following code somewhere in your app:
extension DocumentReference: DocumentReferenceType {}
extension GeoPoint: GeoPointType {}
extension FieldValue: FieldValueType {}
extension Timestamp: TimestampType {}
and now they become Codable
and can be used properly with FirestoreEncoder
and FirestoreDecoder
.
PLEASE NOTE that as FieldValue
is only used to setData()
and updateData()
, it only adopts the Encodable
protocol.
You can use CocoaPods to install CodableFirebase by adding it to your Podfile:
platform :ios, '9.0'
use_frameworks!
target 'MyApp' do
pod 'CodableFirebase'
end
Note that this requires CocoaPods version 36, and your iOS deployment target to be at least 9.0:
You can use Carthage to install CodableFirebase by adding it to your Cartfile:
github "alickbass/CodableFirebase"