为什么 objectWillChange 没有效果
Why objectWillChange has no effect
获得了关于 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"
没有显示?
谢谢。
您必须存储 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 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"
没有显示?
谢谢。
您必须存储 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())
}
}