我已经尝试过ObservableObject documentation中的示例。
class Contact: ObservableObject {
@Published var name: String = "me"
@Published var age: Int = 7
}
当我用代码创建一个Swift Playground时:
let c = Contact()
c.objectWillChange.sink { print("This prints") }
c.age += 1
objectWillChange
触发并打印行。
到目前为止很好。
我现在在SwiftUI中创建一个视图:
struct ContentView: View {
@ObservedObject var contact = Contact
...
我在AppDelegate中创建此视图,然后执行:
contentView.contact.objectWillChange.sink { print("This doesn't print.") }
我已将联系人连接到各种控件,并且更改任何字段都会更新所有控件。做onReceive(contact.objectWillChange)
也可以。但不能在AppDelegate中连接到它。我尝试记录deinit()
以确保我们在谈论同一对象。我尝试使用ImmediateScheduler
。没有骰子。为什么这不起作用?
答案 0 :(得分:1)
使用.sink
创建订阅时,必须保存返回的AnyCancellable
对象
let cancellable = publisher.sink { ... }
如果将其分配给变量,请确保它不是短命的。一旦取消可取消对象的分配,订阅也将被取消。