Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 正在从ObserveObject发布服务器更新状态_Swift_Swiftui_Reactive Programming_Swift5 - Fatal编程技术网

Swift 正在从ObserveObject发布服务器更新状态

Swift 正在从ObserveObject发布服务器更新状态,swift,swiftui,reactive-programming,swift5,Swift,Swiftui,Reactive Programming,Swift5,我曾尝试使用Combine和SwiftUI,但仍停留在更新状态中基本上我想在每次ObservieObject更改时更新视图中的状态, 下面是一个例子 class XViewModel: ObservableObject { @Published var tVal: Bool = false private var cancellables = Set<AnyCancellable>() func change() { Just(true)

我曾尝试使用Combine和SwiftUI,但仍停留在更新状态中基本上我想在每次ObservieObject更改时更新视图中的状态, 下面是一个例子

class XViewModel: ObservableObject {
    @Published var tVal: Bool = false
    private var cancellables = Set<AnyCancellable>()

    func change() {
        Just(true)
            .delay(for: 3.0, scheduler: RunLoop.main)
            .receive(on: RunLoop.main)
            .assign(to: \.tVal, on: self)
            .store(in: &self.cancellables)
    }
}

但看起来,虽然所有的东西都更新了,但它并没有更新状态。是否有任何方法可以更新状态,或者它根本就不需要更新,我需要将我的视图直接绑定到viewModel的tVal值,即publisher


谢谢。

初始化
中,
@状态
尚未准备好操作,请使用
.onReceive
,如下所示

struct ContentView: View {
    @ObservedObject var viewModel = XViewModel()
    @State var toggleVal: Bool = false
    private var cancellables = Set<AnyCancellable>()

    init() {
        self.viewModel.$tVal
            .sink { newVal in
            print(newVal)
        }
        .store(in: &cancellables)        

        viewModel.change()
    }

    var body: some View {
        VStack {
            Toggle(isOn: self.$viewModel.tVal) {
                Text("Toggle")

            Toggle(isOn: self.$toggleVal) {
                Text("Toggle from View")
            }
            .onReceive(self.viewModel.$tVal) { newVal in // << here !!
                self.toggleVal = newVal
            }
    }

}
struct ContentView:View{
@ObservedObject var viewModel=XViewModel()
@状态变量toggleVal:Bool=false
private var cancelables=Set()
init(){
self.viewModel.$tVal
.sink{newVal in
打印(newVal)
}
.store(在:&可取消项中)
viewModel.change()
}
var body:一些观点{
VStack{
切换(isOn:self.$viewModel.tVal){
文本(“切换”)
切换(isOn:self.$toggleVal){
文本(“从视图切换”)
}

.onReceive(self.viewModel.tVal){newVal in//谢谢,是的,我知道状态尚未初始化
viewModel.Just triggers
viewModel.tVal publisher triggers
view.toggleVal state triggers 
updates UI 
struct ContentView: View {
    @ObservedObject var viewModel = XViewModel()
    @State var toggleVal: Bool = false
    private var cancellables = Set<AnyCancellable>()

    init() {
        self.viewModel.$tVal
            .sink { newVal in
            print(newVal)
        }
        .store(in: &cancellables)        

        viewModel.change()
    }

    var body: some View {
        VStack {
            Toggle(isOn: self.$viewModel.tVal) {
                Text("Toggle")

            Toggle(isOn: self.$toggleVal) {
                Text("Toggle from View")
            }
            .onReceive(self.viewModel.$tVal) { newVal in // << here !!
                self.toggleVal = newVal
            }
    }

}