首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有更好的方法来优化这个Firestore查询?

是否有更好的方法来优化这个Firestore查询?
EN

Stack Overflow用户
提问于 2019-06-10 22:24:58
回答 1查看 338关注 0票数 0

现在,我基于另一个字符串数组查询Firestore数组。这很好,但我想知道这是否正确,是否有办法优化它,使它更快。

这是我的密码。

代码语言:javascript
复制
var exampleArray = [test]()

func loadData(textArray : [String]){
        let db = Firestore.firestore()

        for i in 0..<textArray.count{
            db.collection("testCollection").whereField("testField", arrayContains: textArray[i]).getDocuments{ (querySnapshot, err) in
                if let err = err {
                    print("\(err.localizedDescription)")
                    print("Test Error")
                } else {
                    if (querySnapshot!.isEmpty == false){
                        let res = querySnapshot!.documents.compactMap({test(dictionary: $0.data())})
                        self.exampleArray.append(contentsOf: res)
                        self.summaryTableView.reloadData()
                        SVProgressHUD.dismiss()
                        print(self.textArray[i])

                    }
                }
            }
        }
    }

提前谢谢。

更新:

一些信息:

  • 现在,VisionCloudRecognition进程和查询大约需要10-11秒。7秒的识别和3-4查询。
  • 数据库有7700份文件,每个字段7个。

基本上,我的应用程序做了以下工作:

  • 用户拍照
  • 使用OCR,图像变成文本,我将文本附加到一个strings.We数组中,不知道将有多少字符串。可能是0或者50。
  • 然后,我将根据字符串数组查询Firestore数组。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-11 03:42:26

正如注释中所指出的,您正在循环中运行一堆异步请求(这总是很糟糕的),并且重新加载数据,因为每一个都会导致tableView继续用新数据重新绘制。

您要做的是将所有这些db请求添加到DispatchGroup中。当它们解析时,将数据添加到数组中。一旦他们都完成了,做一个单一的tableView.reloadData()和解散您的SVProgressHud

这不仅会加快速度,因为多个调用可以并行进行,而且随着新数据的添加和tableView在快速启动中重新加载X次,您的用户将不会有表行弹出。

编辑:您想要一个示例-这非常快,并写在这里,所以请寻找XCode通知您的任何打字或错误。

代码语言:javascript
复制
class MyVC: UIViewController {

  var exampleArray = [test]()
  let db = Firestore.firestore()
  let dispatchGroup = DispatchGroup()

  override func viewDidLoad(animated: bool) {
    super.viewDidLoad(animated)

    myTableView.delegate = self
    myTableView.dataSource = self

    for i in 0..<textArray.count {
      getTestFieldRecords(i)
    }

    dispatchGroup.notify(queue: .main) {
      self.myTableView.reloadData()
    }
  }

  private func getTestFieldRecords(_ record: Int) {
    dispatchGroup.enter()
    db.collection("testCollection").whereField("testField", arrayContains: textArray[i]).getDocuments{ (querySnapshot, err) in
      if let err = err {
        print("\(err.localizedDescription)")
        print("Test Error")
      } else {
        // rest of your code because I'm too lazy to format it
      }
      self.dispatchGroup.leave()
    }
  }

}

确保每次调用leave()都是错误的还是不错误的。在使用一个DispatchGroup命令完成所有enter()命令之前,leave()不会完成。希望这能帮你找到正确的方向!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56534244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档