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 个文档,则更好的是获取分页数据)