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 { ... }
如果将它分配给变量,请确保它不是短暂存在的。一旦取消分配可取消对象,订阅也将被取消。
我试过 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 { ... }
如果将它分配给变量,请确保它不是短暂存在的。一旦取消分配可取消对象,订阅也将被取消。