我从Firestore获取数据,映射文档并使用FirestoreDecoder对每个文档进行解码。但是,对文档进行解码会暂时冻结UI。在后台线程上运行代码没有什么区别。如何防止UI在解码过程中冻结?
let collection = Firestore.firestore().collection("roll_groups")
collection.addSnapshotListener { (snapshot, error) in
if let error = error {
print("Error fetching roll groups: (error.localizedDescription)")
} else if let snapshot = snapshot {
DispatchQueue.global(qos: .background).async {
let rollGroups = snapshot.documents.map { doc -> RollGroup? in
do {
let rollGroup = try FirestoreDecoder().decode(RollGroup.self, from: doc.data())
return rollGroup
} catch {
print("Error decoding roll groups: (error)")
return nil
}
}
DispatchQueue.main.async {
completion(rollGroups)
}
}
}
}
可能的解决方案
看看这段代码,一切似乎都很好,我只想确认你的方法的completion
肯定是@escaping: completion()
,否则它可能会导致这个问题
此外,在中封装实际的DB调用(collection.addSnapshotListener)
可能是值得的
DispatchQueue.global(qos: .background).async
只是想看看这是否有什么不同,理论上不应该,但尽管如此,还是值得一试