簡體   English   中英

SwiftUI @已發布和主線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM