[英]SwiftUI @Published and main thread
有人可以解釋為什么我會收到此警告:不允許從后台線程發布更改; 確保在 model 更新上發布來自主線程的值(通過接收(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 = []
}
}
}
}
@Published
屬性包裝器創建聲明類型的發布者,僅此而已。 該文檔可能能夠提供進一步的清晰度。
至於它發生在某些視圖模型上而不是其他視圖模型上,我們無法在這里說出來,因為我們沒有代碼。 然而,最好的做法是使用DispatchQueue.main.async
塊或.receive(on: DispatchQueue.main)
修飾符進行組合,正如您在更新 UI 時已經發現的那樣。
很有可能您的其他 viewModel 已經在使用主線程,或者 viewModel 上的屬性沒有用於更新 UI,同樣沒有我們永遠無法確定的代碼。
顯然, contactsRepo.findMutuals
可以在后台線程上調用其完成處理程序。 您需要通過回到主線程來避免這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.