【问题标题】:Why objectWillChange has no effect为什么objectWillChange没有效果
【发布时间】:2020-11-24 06:46:31
【问题描述】:

我从Apple official website得到这个关于 ObservableObject 的示例代码

import Foundation

class Contact: ObservableObject {
    @Published var name: String
    @Published var age: Int
    
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    func changeAge() -> Int {
        self.age += 1
        return self.age
    }
}



class Test {
    init() {
        let john = Contact(name: "John Appleseed", age: 24)
        _ = john.objectWillChange
            .sink { _ in
                print("\(john.age) will change")
        }
        print(john.changeAge())
    }
}

let test = Test()

swift Contact.swift在终端上运行时,结果只有25,但官网显示结果应该是

// Prints "24 will change"
// Prints "25"

为什么第一行Prints "24 will change"没有显示?

谢谢。

【问题讨论】:

    标签: swift combine


    【解决方案1】:

    您必须存储sink返回的AnyCancellable,否则它会在您分配给_时取消初始化后立即取消订阅。

    在您的简单示例中,仅分配给局部变量就足以获得所需的打印输出,因为当您更改年龄时该变量仍然存在:

    let c = john.objectWillChange.sink {...}
    

    但在实际应用中,您可能希望将其分配给一个属性,以便在您需要的持续时间内保留订阅。通常,它是这样完成的:

    class Test {
        private var c: Set<AnyCancellable> = []
        init() {
            let john = Contact(name: "John Appleseed", age: 24)
            john.objectWillChange
                .sink { _ in
                    print("\(john.age) will change")
                }
                .store(in: &c) // store here
            print(john.changeAge())
        }
    }
    

    【讨论】:

    • import Combine 可能需要声明AnyCancellable
    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2021-04-17
    • 2018-02-24
    • 2011-05-05
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多