Swift 5.1 / Cocoa: как зарегистрировать метод в классе, отличном от self, в качестве наблюдателя уведомлений? - PullRequest
0 голосов
/ 05 февраля 2020

Я могу установить sh обратный вызов наблюдателя, передав self и ссылаясь на метод в том же классе:

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        DistributedNotificationCenter.default
                          .addObserver(
                            self,
                            selector: #selector(notificationReceived),
                            name: NSNotification.Name(rawValue: "Hello"),
                            object: nil)
    }

    @objc func notificationReceived() {
        print("I have received the notification!")
    }

    //...

В вышеприведенном случае notificationReceived вызывается, когда уведомление вывешенный. Однако я не могу сделать то же самое, если я хочу зарегистрировать обратный вызов, принадлежащий другому классу:

class Another {
    @objc func notificationReceived() {
        print("I have received the notification!")
    }
}

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        let observer = Another()

        DistributedNotificationCenter.default
                          .addObserver(
                            observer,
                            selector: #selector(observer.notificationReceived),
                            name: NSNotification.Name(rawValue: "Hello"),
                            object: nil)
    }

Почему не работает вышеуказанное? Что мне нужно сделать, чтобы зарегистрировать метод, принадлежащий объекту, отличному от self, в качестве обратного вызова?

1 Ответ

1 голос
/ 05 февраля 2020

Это не имеет ничего общего с "другим классом". Это связано с временем жизни объекта.

Вы говорите let observer = Another(), и в следующее мгновение метод didFinish заканчивается, и ваш экземпляр Другой, observer, исчезает в облаке дыма , Так что некому разговаривать с центром уведомлений. Нет никаких шансов для получения каких-либо уведомлений; наблюдатель ушел, прежде чем это может произойти.

(Действительно, раньше это было cra sh для этого, потому что вы оставили центр уведомлений с "висящим указателем". Теперь вы не взломали sh, но ничего не происходит.)

Это не относится к self, не потому, что self "тот же класс", а потому, что это делегат приложения, который живет всю жизнь приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...