为啥我不能将从 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 变量 [重复]