[英]How to use FirebaseFirestoreSwift for read Custom objects
我正在關注 文檔,但仍然收到錯誤expected argument type 'FirestoreSource'
。 我的 Xcode 目標是 15.0。 和 Firebase 版本 8.15.0 (SPM)
import FirebaseFirestore
import FirebaseFirestoreSwift
let db = Firestore.firestore()
func getUser() -> User {
let docRef = db.collection("users").document(Auth.auth().currentUser)
docRef.getDocument(as: User.self) { result in //error: expected argument type 'FirestoreSource'
switch result {
case .success(let user):
print(user)
case .failure(let error):
print("Error decoding: \(error)")
}
}
}
這是自定義 object 用戶。
struct User: Codable, Identifiable, Hashable {
@DocumentID var id: String?
var username: String = ""
var email: String = ""
var family: [Family]
enum CodingKeys: String, CodingKey {
case id
case username
case email
case family
}
struct Family: Codable, Hashable {
var username: String = ""
var phoneNumber: String = ""
var email: String = ""
enum CodingKeys: String, CodingKey {
case username
case phoneNumber
case email
}
}
}
代碼有幾個問題
1 - 代碼嘗試在不導入 FirebaseAuth 的情況下使用Auth
。 請加
import FirebaseAuth
頂配rest的進口
2 - 這個電話
Auth.auth().currentUser
返回 firebase 用戶 object 所以它不會在這里工作
let docRef = db.collection("users").document(Auth.auth().currentUser)
您可能想要獲取用戶 uid
let uid = Auth.auth().currentUser.uid
let docRef = db.collection("users").document(uid)
3 - function 設置為返回用戶
func getUser() -> User {
Firebase 調用是異步的,因此不能以這種方式返回用戶(或其他任何東西)。 有幾個選項是使用帶有@escaping
子句的完成處理程序或更新的async await
調用,看起來像這樣從用戶集合中檢索特定文檔並返回“名稱”字段的值
func getUserAsync() async -> String{
let usersCollection = self.db.collection("users")
let thisUserDoc = usersCollection.document("uid_0")
let snapshot = try! await thisUserDoc.getDocument()
let name = snapshot.get("name") as? String ?? "No Name"
return name
}
在 SO 上有很多關於這兩個的參考。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.