如何从存储在 Firestore (Swift) 中的文档中返回对象

Posted

技术标签:

【中文标题】如何从存储在 Firestore (Swift) 中的文档中返回对象【英文标题】:How do I return an object from a document stored in 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 行生成的。

【问题讨论】:

【参考方案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 只是一件小事;-)

以上是关于如何从存储在 Firestore (Swift) 中的文档中返回对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将 Firestore FieldValue 解析为日期

如何从 Cloud Firestore 上的对象中检索值?迅速

如何在 Swift 中从 Cloud FireStore Firebase 访问特定字段

如何从Swift中的Cloud FireStore Firebase访问特定字段

将数据从 Firestore 映射到 Swift 中的结构 - IOS

Swift - 从随机创建的文档 ID 中获取字段(Firestore)