我遇到了这样的问题。当打开一个新的VC从Firebase Storage获取几张图片(在本例中为9张图片,每张图片为几KB)并从Firestore获取少量文档时,该应用程序会冻结大约2-4秒,然后再冻结打开并显示视图。我有一个标签栏控制器,在显示视图之前,我无法点击任何其他标签栏元素。
我拥有所有的Firebase引用,并在viewWillAppear内调用该函数,我也尝试将所有内容放入ViewDidLoad和viewDidAppear中,但是遇到了同样的问题。
是否有解决方案,是我做错了还是只需要忍受呢?
我拥有最新的Firebase版本,我使用的是Swift 4,并且具有1000mb的互联网连接。
var db: Firestore!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
tableView.delegate = self
tableView.dataSource = self
db = Firestore.firestore()
getTasks()
tableView.reloadData()
}
func getTasks() {
db.collection("School").document(school).collection("Projects").document((project?.projectId)!).collection("Tasks").whereField("Completed", isEqualTo: false).addSnapshotListener { (snapshot, error) in
if let error = error {
print(error)
} else {
self.tasks = snapshot!.documents.compactMap({TaskModel(dictonary: $0.data())})
self.tableView.reloadData()
}
}
}
答案 0 :(得分:0)
似乎您正在从主线程(阻止UI)中获取数据。使用GCD异步获取数据,然后重新加载表格视图。
DispatchQueue.global(qos: .background).async {
self.getTasks()
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
答案 1 :(得分:0)
在呈现该视图之前,您的代码将获取所有图像,这就是它冻结的原因。如果您使用过Firebase,则必须了解它会下载主节点中存在的所有子节点。
解决方案:-解决冻结问题的一种方法是在“ viewdidAppear()”函数中调用“ getTasks()”函数。因此,您将可以在同时加载数据的同时访问视图。您也可以使用活动指示器来指示数据正在下载。