ios - SwiftUI - 将 Firbase 数据库输出分配给数据模型
问题描述
我是 swift 和 Firebase 的新手。我试图理解它。
我有一个 Cloud Firestore 数据库,我在其中存储一些用户数据,例如用户名和电子邮件。现在我希望将给定用户的输出分配给我的 UserData 模型以便于使用。我真的不知道如何实现这一点。
这是我的两个文件:
User.swift
import SwiftUI
import Firebase
import FirebaseFirestore
struct User {
var username : String
var email : String
}
GetData.swift
let docRef = db.collection("users").document(Auth.auth().currentUser?.uid)
docRef.getDocument { (document, error) in
if let document = document, document.exists {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
print("Document data: \(dataDescription)")
} else {
print("Document does not exist")
}
}
变量 dataDescription 给了我一个字典数组,包含所有需要的值。现在我需要将该字典分配给我的 User.swift 结构。
此致!
仅供参考:Firebase 打印屏幕
解决方案
我建议尽可能使用 Codable。我正在使用CodableFirebase
Cocoapod 来帮助进行 Firebase 解析。下面是一个如何使用它的例子:
let docRef = db.collection("users").document(Auth.auth().currentUser?.uid)
docRef.getDocument { (document, error) in
guard let value = document.value, value as? NSNull == nil else {
return
}
do {
let newValue = try self.decoder.decode(User.self, from: value)
///New value created here
} catch let error {
print(error)
}
}
您可以通过传递类类型并返回可选实例来使其更通用:
static func item<T: Codable>(_ item: T.Type, docRef: DatabaseReference, completion: @escaping ((Result<T?, Error>)->Void)) {
docRef.getDocument { (document, error) in
guard let value = snapshot.value, value as? NSNull == nil else {
completion(.success(nil))
return
}
do {
let newValue = try self.decoder.decode(T.self, from: value)
completion(.success(newValue))
} catch let error {
completion(.failure(error))
}
}
}