SwiftUI: Почему ObservedObject не работает в AppDelegate? - PullRequest
0 голосов
/ 17 октября 2019

Я пробовал пример из документации ObservableObject .

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 триггеры и линия печатает.

Пока все хорошо.

Теперь я делаю View в SwiftUI:

struct ContentView: View {
    @ObservedObject var contact = Contact
    ...

Я создаю это представление в AppDelegate, иdo:

   contentView.contact.objectWillChange.sink { print("This doesn't print.") }

Я подключил контакт к различным элементам управления, и изменение любых полей обновляет все элементы управления. Doing onReceive(contact.objectWillChange) также работает нормально. Но не подключаясь к нему в AppDelegate. Я попытался войти deinit(), чтобы убедиться, что мы говорим об одном и том же объекте. Я пытался использовать ImmediateScheduler. Нет кости. Почему это не работает?

1 Ответ

1 голос
/ 17 октября 2019

Когда вы создаете подписку с помощью .sink, вам нужно сохранить объект AnyCancellable, возвращенный

let cancellable = publisher.sink { ... }

И, если вы назначите ее переменной, убедитесь, что она недолговечна. Как только отменяемый объект будет освобожден, подписка также будет отменена.

...