如何在主线程中接收@Published var

use*_*155 6 ios swift swiftui combine property-wrapper

我将模型作为已发布的变量保留在 ViewModel 中,并从视图中观察它。

\n

当模型进程进入后台线程时,如果您发布模型值,Xcode 线程检查器将会做出反应。

\n
\n

不允许从后台线程发布更改;确保在模型更新时从主线程发布值 \xe2\x80\x8b\xe2\x80\x8b (通过像 receive (on :) 这样的运算符)。

\n
\n

已发出。

\n
@StateObject var viewModel = ViewModel()\n
Run Code Online (Sandbox Code Playgroud)\n
class ViewModel: ObservableObject {\n\n    @Published var model = Model()\n    var thisValue:String {\n        return model.thisValue // I want to use this value in view\n    }\n
Run Code Online (Sandbox Code Playgroud)\n
struct Model {\n    var thisValue:String = "value" // I want to change this value on background threads.\n
Run Code Online (Sandbox Code Playgroud)\n

我想知道如何在主线程中接收模型值,但是\n我不太明白并提出了一个问题。

\n

如果你能告诉我,我会很高兴。

\n

Pau*_*l B 0

不太明白你想要做什么。但如果您不满意,DispatchQueue.main.async可以尝试以下选项之一:

结合

struct Model {
    var thisValue: String = "value"
}

class ViewModel: ObservableObject {
    @Published var model = Model()
    var thisValue: String {
        model.thisValue
    }
    func setThisValueInBackground() {
        DispatchQueue.global(qos: .background).async {
            Just(Model(thisValue: "newValue")).receive(on: RunLoop.main).assign(to: &self.$model)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

取消发布您的model并使用属性观察器代替

class ViewModelV2: ObservableObject {
    var model = Model() {
        didSet {
            thisValue = model.thisValue
        }
    }
    @Published private(set) var thisValue: String = ""
    func setThisValueInBackground() {
        DispatchQueue.global(qos: .background).async {
            self.model = Model(thisValue: "newValue")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

2016 次

最近记录:

3 年,3 月 前