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

SwiftUI: Why doesn't ObservedObject work in AppDelegate?

我试过 ObservableObject documentation 中的示例。

class Contact: ObservableObject {
    @Published var name: String = "me"
    @Published var age: Int = 7
}

当我使用代码制作 Swift 游乐场时:

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。没有骰子。为什么这不起作用?

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

let cancellable = publisher.sink { ... }

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