当我们从 FireStore 检索数据时,tableview.reloaddata() 在 Dispatchqueue.main.sync 之外仍然有效

tableview.reloaddata() still works outside of Dispatchqueue.main.sync when we retrieve data from FireStore

规则是“如果您在另一个线程中工作的闭包内更新用户界面,那么您应该调用 DispatchQueue.main.async 方法。但是,在我从 Firestore 检索数据后,tableview.reloadData() 在 DispatchQueue.main.async 方法不存在的情况下仍然有效,并且它在闭包内的 MainThread 中有效。这怎么可能?有什么改变吗?Xcode 12.4 版;Swift版本 5

   func loadMessages(){
    messages = []
    
    db.collection(K.FStore.collectionName).getDocuments { (querySnapShot, error) in
        if let err = error {
            print("There was an issue retrieving data from Firestore. \(err)")
        }else{
            if let snapShotDocuments = querySnapShot?.documents{
                for doc in snapShotDocuments{
                    let data = doc.data()
                    if let messageSender = data[K.FStore.senderField] as? String,let messagebody = data[K.FStore.bodyField] as? String{
                        let newMessage = Message(sender: messageSender, body: messagebody)
                        self.messages.append(newMessage)
                    }
                }
            }
            if Thread.isMainThread{
                self.tableView.reloadData()
            }
        }
    }
}

Firestore SDK(和大多数 Firebase SDK)在主线程上调用您的回调,正是为了让您可以轻松更新 UI。他们过渡到主线程,这样你就不必了。

另见我的回答:

  • Firebase asynchronous function, what's in the background queue and what's not
  • Firebase iOS execute on background thread