打开VC并从Firebase获取数据时,应用程序“冻结”

时间:2019-01-04 14:56:36

标签: ios swift firebase google-cloud-firestore

我遇到了这样的问题。当打开一个新的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()
        }
    }
}

2 个答案:

答案 0 :(得分:0)

似乎您正在从主线程(阻止UI)中获取数据。使用GCD异步获取数据,然后重新加载表格视图。

DispatchQueue.global(qos: .background).async { 

    self.getTasks()
    DispatchQueue.main.async { 
       self.tableView.reloadData()
    }
}

答案 1 :(得分:0)

在呈现该视图之前,您的代码将获取所有图像,这就是它冻结的原因。如果您使用过Firebase,则必须了解它会下载主节点中存在的所有子节点。

解决方案:-解决冻结问题的一种方法是在“ viewdidAppear()”函数中调用“ getTasks()”函数。因此,您将可以在同时加载数据的同时访问视图。您也可以使用活动指示器来指示数据正在下载。