有人可以解釋為什么我會收到此警告:不允許從后臺執行緒發布更改;確保在模型更新時從主執行緒(通過像 receive(on:) 這樣的運算子)發布值。
我知道,如果我將更改包裝起來DispatchQueue.main.async,問題就會消失。為什么它發生在某些視圖模態而不是其他視圖模態?我認為由于變數@Published自動成為主執行緒上的發布者?
class VM: ObservableObject {
private let contactsRepo = ContactsCollection()
@Published var mutuals: [String]?
func fetch() {
contactsRepo.findMutuals(uid: uid, otherUid: other_uid, limit: 4) { [weak self] mutuals in
guard let self = self else { return }
if mutuals != nil {
self.mutualsWithHost = mutuals // warning...
} else {
self.mutualsWithHost = []
}
}
}
}
uj5u.com熱心網友回復:
顯然,contactsRepo.findMutuals可以在后臺執行緒上呼叫其完成處理程式。您需要通過回到主執行緒來避免這種情況。
uj5u.com熱心網友回復:
該@Published包裝創建宣告型別的出版商,沒有什么更多的財產。該檔案可能能夠提供進一步的清晰度。
至于它發生在某些視圖模型上而不是其他視圖模型上,我們無法在這里說明,因為我們沒有代碼。但是,正如您在更新 UI 時已經發現的那樣,使用DispatchQueue.main.async塊或.receive(on: DispatchQueue.main)修飾符進行組合始終是最佳實踐。
很有可能您的另一個 viewModel 已經在使用主執行緒,或者 viewModel 上的屬性沒有被用于更新 UI,如果沒有代碼,我們將永遠無法確定。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/386650.html
上一篇:應用11月補丁后,從在Delphi11上崩潰的EXE檔案獲取版本資訊
下一篇:發送到連接的客戶端的最佳實踐
