当我们从 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
规则是“如果您在另一个线程中工作的闭包内更新用户界面,那么您应该调用 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