繁体   English   中英

Swift Combine 不通过 sink 更新值

[英]Swift Combine doesn't update value by sink

我想实现这个: A class A ,它有一个属性var c1: Cvar b1: B ,如果C的属性发生变化,那么b1的属性应该更新。

这是我的代码:

import UIKit
import Combine

struct B {
    var b = "b"
}

class C: ObservableObject {
    @Published var c: String = "c1"
}

class A: ObservableObject {
    var b1 = B()
    var cancellables = Set<AnyCancellable>()
    @Published var c1 = C()

    init() {

        $c1.sink {
            print("new value is \($0.c)") //Only print once
            self.b1.b = $0.c
        }.store(in: &cancellables)
    }

    func printMe() {
        print("b1.b: \(b1.b)")
        print("c1.c: \(c1.c)")
    }
}



let a = A()
a.c1.c = "c2"
a.printMe()


a.c1.c = "c3"
a.printMe()

output 是:

new value is c1
b1.b: c1
c1.c: c2
b1.b: c1
c1.c: c3

每次更新a.c1.c时,我预计a.b1.b应该由sink自动更新,不确定我是否遗漏了什么, sink闭包体只被调用了一次。

有什么建议吗? 谢谢!

使用@Published var c1 = C()$c1.sink您正在观察A的属性c1的变化。 这个分配不会改变,因为它是一个引用类型,所以接收器只在初始化时被调用。

将接收器更新为:

c1.$c.sink {
    print("new value is \($0)") //Prints every time! 
        self.b1.b = $0
    }.store(in: &cancellables)

提供您正在寻找的行为。 我不认为 c1 发布者会在这种情况下发出任何值,但不清楚您在那里寻找什么行为,所以我没有深入研究。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM