【发布时间】:2017-10-12 10:59:12
【问题描述】:
我正在编写一个函数,该函数从 API 调用中提取信息,解析生成的 JSON,循环遍历每个结果项,然后在以下视图控制器上显示此信息。在这个循环中,我必须从 Firestore 数据库中提取每个项目的信息。
我正在使用 Swift 4 和 Firestore 0.8.0
下面的代码是我到目前为止一直在使用的代码,它考虑了我们的数据库中是否可能不存在一个项目,只有当所有 Firestore 请求都完成时才会发生转场:
for item in results {
dispatch.enter()
//Main loop code for processing the API Call & pulling the document ID for this item
let docRef = db.collection("collection").document(documentID)
docRef.getDocument { (document, error) in
if (document?.exists ?? false), error == nil {
if let document = document {
let data = document.data()
print("EXISTS")
//do things
dispatch.leave()
} else {
print("Document does not exist")
dispatch.leave()
}
} else {
print("DOES NOT EXIST")
//do other things
dispatch.leave()
}
}
}
dispatch.notify(queue: .main) {
//perform a segue to the data display VC
}
(代码是使用这个问题编写的 -> Crashes with Firestore,如果您的集合中不存在文档,目前 Firestore 最初不会返回 nil 值)
我遇到的问题是这个功能最终需要几分钟才能完成。有没有更快的方法来执行这个循环的文档请求?这只是测试版性能吗?
我们的 Firestore 集合最终将拥有超过 1,000,000 个文档,并且从每个文档中提取的字段具有如下嵌套来源:
collection {
document {
object {
item1: data to pull
item2: data to pull
...etc
}
}
}
任何帮助将不胜感激!
更新和结论
似乎我对此采取了相反的方法!由于我们数据库的性质意味着我们存储 API 数据的所有文档,因此我可以在 Firestore 数据库上执行单个查询以限制数据,然后强制 API 调用仅返回基于初始查询找到的文档的结果。这样就无需检查我们的数据库中是否存在任何 API 调用结果文档!轻轻松松!
【问题讨论】:
-
您是否有理由不能只加载整个集合,而不是循环并一次加载一个文档?
-
@MorganChen 如果您指的是 getDocuments,那么它在用户设备上的性能会非常高。他们将加载 1,000,000 个 50kb 大小的文档,以便从每个文档中显示大约 5kb 的数据,大约 500-1,000 个结果
-
我可能有误会,但是您是否有理由不能将查询限制为仅加载 500-1000 个结果而不是加载全部 1000000 个结果?
-
我们可以通过这种方式查询数据库条目的唯一方法是通过我们的 API 调用收集的 id 字段。这取决于是否可以从这样的 id 数组进行查询,并且可以从查询中执行单个 getDocuments。从 API 调用结果中收集的 id 不断变化
-
全部排序!有关详细信息,请参阅我的问题更新 - 问题在于我自己调用 API 的方法
标签: ios swift loops firebase google-cloud-firestore