为啥我不能将从 Firestore 获取的值分配给 Swift 中的数组?

Posted

技术标签:

【中文标题】为啥我不能将从 Firestore 获取的值分配给 Swift 中的数组?【英文标题】:Why I couldn't assign fetched values from Firestore to an array in Swift?为什么我不能将从 Firestore 获取的值分配给 Swift 中的数组? 【发布时间】:2018-09-09 13:19:08 【问题描述】:

我多次尝试使用各种方法将收集到的文档值从 firestore 分配到一个数组中。不幸的是,我找不到解决此问题的方法。我附上了我最近尝试实现的代码。它包括在 Firestore 关闭之前成功打印整个获取值的打印语句。但是,在关闭之后,我尝试打印相同的数组,结果是一个空数组。

我尝试实现这段代码

var hotelCities: [String] = []

func getCities() 
    db.collection("Hotels").getDocuments()  (querySnapshot,  err) in
        if let err = err 
            print("Error getting documents: \(err)")
         else 
            for document in querySnapshot!.documents 
                var found = false
                let documentDetails = document.data() as NSDictionary
                let location = documentDetails["Location"] as! NSDictionary
                let city = location["city"]!
                if (self.hotelCities.count == 0) 
                    self.hotelCities.append(String(describing: city))
                
                else
                    for item in self.hotelCities 
                        if item == String(describing: city)
                            found = true
                        
                    
                    if (found == false)
                        self.hotelCities.append(String(describing: city))
                    
                
            
        
        print(self.hotelCities)
    
    print(self.hotelCities)

【问题讨论】:

发布您的代码,而不是(链接到)屏幕截图。 – 但请注意,类似的问题已经被问过和回答过,搜索“如何从异步请求中返回值”应该会给你一些答案。 我已经添加了我尝试实现的代码 【参考方案1】:

这实际上是预期的结果,因为数据是从 Firestore 异步加载的。

一旦您调用getDocuments(),Firestore 客户端就会启动并连接到服务器以读取这些文档。由于这可能需要相当长的时间,因此它允许您的应用程序在此期间继续运行。然后,当文件可用时,它会调用您的关闭。但这意味着文档只有在调用闭包后才可用。

通过放置一些打印语句最容易理解这个流程:

print("Before starting to get documents");
db.collection("Hotels").getDocuments()  (querySnapshot,  err) in
  print("Got documents");

print("After starting to get documents");

当你运行这段代码时,它会打印:

开始获取文件之前

开始获取文件后

拿到文件

现在,当您第一次看到这段代码时,这可能不是您预期的输出。但这完全解释了为什么关闭后的print(self.hotelCities) 没有打印任何内容:数据尚未加载。

快速的解决方案是确保所有需要文档的代码都在加载文档时调用的 close 内。就像您最重要的 print(self.hotelCities) 声明一样。

另一种方法是定义您自己的闭包,如以下答案所示:https://***.com/a/38364861

【讨论】:

以上是关于为啥我不能将从 Firestore 获取的值分配给 Swift 中的数组?的主要内容,如果未能解决你的问题,请参考以下文章

将 Firebase Firestore 文档值分配给 swift 变量 [重复]

为啥我不能将 string::back 分配给字符串?

将从@escaping接收的值分配给swift中另一个类中的实例变量

将从核心数据中获取的数据分配给 UIPickerView

c# 将从单个文本框中获取的多个值分配给标签

为啥无论分配给变量 a 的值如何,我总是得到 1 作为答案