现在,我基于另一个字符串数组查询Firestore数组。这很好,但我想知道这是否正确,是否有办法优化它,使它更快。
这是我的密码。
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])
}
}
}
}
}提前谢谢。
更新:
一些信息:
基本上,我的应用程序做了以下工作:
发布于 2019-06-11 03:42:26
正如注释中所指出的,您正在循环中运行一堆异步请求(这总是很糟糕的),并且重新加载数据,因为每一个都会导致tableView继续用新数据重新绘制。
您要做的是将所有这些db请求添加到DispatchGroup中。当它们解析时,将数据添加到数组中。一旦他们都完成了,做一个单一的tableView.reloadData()和解散您的SVProgressHud。
这不仅会加快速度,因为多个调用可以并行进行,而且随着新数据的添加和tableView在快速启动中重新加载X次,您的用户将不会有表行弹出。
编辑:您想要一个示例-这非常快,并写在这里,所以请寻找XCode通知您的任何打字或错误。
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()不会完成。希望这能帮你找到正确的方向!
https://stackoverflow.com/questions/56534244
复制相似问题