CodableFirebase
CodableFirebase copied to clipboard
Use Codable with Firebase
CodableFirebase
Overview
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
}
Firebase Realtime Database usage
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)
}
})
Firebase Cloud Firestore usage
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")
}
}
How to use GeoPoint
, DocumentRefence
, FieldValue
, Timestamp
in Cloud Firestore
In 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.
Integration
CocoaPods (iOS 9+)
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:
Carthage (iOS 9+)
You can use Carthage to install CodableFirebase by adding it to your Cartfile:
github "alickbass/CodableFirebase"