簡體   English   中英

如何使用 FirebaseFirestoreSwift 讀取自定義對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM