Cloud Firestore - 循环 getDocument 请求(500 多个文档)性能低下 (Swift)
Cloud Firestore - Slow performance with looped getDocument request (500+ documents) (Swift)
我正在编写一个函数,该函数从 API 调用中提取信息,解析生成的 JSON,遍历每个结果项,然后在以下视图控制器上显示此信息。在这个循环中,我必须从我们的 Firestore 数据库中提取每个项目的信息。
我正在使用 Swift 4 & Firestore 0.8.0
下面的代码是我到目前为止一直在使用的代码,它考虑了我们的数据库中是否存在某个项目,只有在所有 Firestore 请求都已完成时才会发生 segue:
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
}
(代码是使用这个问题编写的 -> ,如果您的集合中不存在文档,目前 Firestore 最初不会 return nil 值)
我遇到的问题是这个函数最终需要几分钟才能完成。有没有更快的方法来执行这个循环文档请求?这只是测试版性能吗?
我们的 Firestore 集合最终将拥有超过 1,000,000 个文档,并且从每个文档中提取的字段具有嵌套来源,如下所示:
collection {
document {
object {
item1: data to pull
item2: data to pull
...etc
}
}
}
如有任何帮助,我们将不胜感激!
更新与结论
看来我是反其道而行之!由于我们数据库的性质意味着我们存储 API 数据的所有文档,因此我可以在我们的 Firestore 数据库上执行单个查询以限制数据,然后强制 API 调用仅 return基于初始查询找到的文档的结果。这消除了检查我们的数据库中是否存在任何 API 调用结果文档的需要!轻松愉快!
我认为问题在于您对数据库发出了 500 多个单独的提取请求。无论如何,这可能会很慢。
我会想方设法将这些数据放入一个集合中,然后查询该集合以获取您需要的文档。这至少可以让您通过一次调用获取这些数据(或者,如果您不需要一次需要所有 500 个文档,则更好的是获取分页数据)
我正在编写一个函数,该函数从 API 调用中提取信息,解析生成的 JSON,遍历每个结果项,然后在以下视图控制器上显示此信息。在这个循环中,我必须从我们的 Firestore 数据库中提取每个项目的信息。
我正在使用 Swift 4 & Firestore 0.8.0
下面的代码是我到目前为止一直在使用的代码,它考虑了我们的数据库中是否存在某个项目,只有在所有 Firestore 请求都已完成时才会发生 segue:
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
}
(代码是使用这个问题编写的 ->
我遇到的问题是这个函数最终需要几分钟才能完成。有没有更快的方法来执行这个循环文档请求?这只是测试版性能吗?
我们的 Firestore 集合最终将拥有超过 1,000,000 个文档,并且从每个文档中提取的字段具有嵌套来源,如下所示:
collection {
document {
object {
item1: data to pull
item2: data to pull
...etc
}
}
}
如有任何帮助,我们将不胜感激!
更新与结论
看来我是反其道而行之!由于我们数据库的性质意味着我们存储 API 数据的所有文档,因此我可以在我们的 Firestore 数据库上执行单个查询以限制数据,然后强制 API 调用仅 return基于初始查询找到的文档的结果。这消除了检查我们的数据库中是否存在任何 API 调用结果文档的需要!轻松愉快!
我认为问题在于您对数据库发出了 500 多个单独的提取请求。无论如何,这可能会很慢。
我会想方设法将这些数据放入一个集合中,然后查询该集合以获取您需要的文档。这至少可以让您通过一次调用获取这些数据(或者,如果您不需要一次需要所有 500 个文档,则更好的是获取分页数据)