【问题标题】:How do I return an object from a document stored in Firestore (Swift)如何从存储在 Firestore (Swift) 中的文档中返回对象
【发布时间】:2020-02-14 11:56:22
【问题描述】:

我在 firebase 中有一个用户集合和一个用户结构。我需要编写一个函数,接收用户的 id 并返回相应的用户对象:

struct AppUser: Codable {

    var id: String
    var displayName: String
    var photoURL: String
    var points: Int?
    var knownLanguageCodes: Set<String>?

}

这是我目前拥有的功能。

func getUser(id: String) -> AppUser? {

    let db = Firestore.firestore()
    let userRef = db.collection("users").document(id)

    userRef.getDocument { (document, error) in
         if let document = document, document.exists {
            let userID = document.data()?["id"] as! String
            let userDisplayName = document.data()?["displayName"] as! String
            let userPhotoURL = document.data()?["photoURL"] as! String
            let userPoints = document.data()?["points"] as! Int?
            let userKnownLanguageCodes = document.data()?["knownLanguageCode"] as! Set<String>?
            let user = AppUser(id: userID,
                               displayName: userDisplayName,
                               photoURL: userPhotoURL,
                               points: userPoints,
                               knownLanguageCodes: userKnownLanguageCodes)
            return user
         } else {
            print("Error getting user")
            return nil
        }
    }
}

上面的两个return语句都给出了错误:Unexpected non-void return value in void function

我在https://cloud.google.com/firestore/docs/query-data/get-data 的“自定义对象”标题下查看了代码,它似乎对我不起作用。我收到错误:“NSObject”类型的值没有成员“数据”。这是在链接中代码的第 6 行生成的。

【问题讨论】:

    标签: ios swift firebase google-cloud-firestore


    【解决方案1】:

    你不能在闭包内返回使用类似的完成

    func getUser(id: String,completion:@escaping((AppUser?) -> ())) {
    
        let db = Firestore.firestore()
        let userRef = db.collection("users").document(id) 
        userRef.getDocument { (document, error) in
             if let document = document, document.exists {
                let userID = document.data()?["id"] as! String
                let userDisplayName = document.data()?["displayName"] as! String
                let userPhotoURL = document.data()?["photoURL"] as! String
                let userPoints = document.data()?["points"] as! Int?
                let userKnownLanguageCodes = document.data()?["knownLanguageCode"] as! Set<String>?
                let user = AppUser(id: userID,
                                   displayName: userDisplayName,
                                   photoURL: userPhotoURL,
                                   points: userPoints,
                                   knownLanguageCodes: userKnownLanguageCodes)
                completion(user)
             } else {
                print("Error getting user")
                completion(nil)
            }
        }
    }
    

    打电话

    getUser(id:<#str#>) { user in
      print(user)
    }
    

    【讨论】:

    • 这个getUser.(id:&lt;#str#&gt;) { user in 应该是self.getUser(id: idString) { user in 只是一件小事;-)
    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多