SwiftUI:为什么ObservedObject在AppDelegate中不起作用?

时间:2019-10-17 08:54:07

标签: swift macos swiftui appkit combine

我已经尝试过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。没有骰子。为什么这不起作用?

1 个答案:

答案 0 :(得分:1)

使用.sink创建订阅时,必须保存返回的AnyCancellable对象

let cancellable = publisher.sink { ... }

如果将其分配给变量,请确保它不是短命的。一旦取消可取消对象的分配,订阅也将被取消。