методы не вызываются после добавления класса в качестве наблюдателя для уведомлений

У меня есть класс CoreSpotlight (класс NSObject), в этом классе у меня есть методы, которые должны реагировать на уведомления. Я пытаюсь создать экземпляр этого класса в делегате приложения и вызвал метод, чтобы добавить сам экземпляр в качестве наблюдателя.

func addCoreSpotLightAsObserverForItemInstallerNotifications() {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "addNewInstalledItemToSpotlightIndex:", name: "ItemInstallerItemInstalledNotification", object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "removeUninstalledItemFromSpotlightIndex:", name: "ItemInstallerItemUninstalledNotification", object: nil)
    NSLog("Corespotlight added as observer///////////////////////////////////////////")
}

Вот как я вызываю метод в делегате приложения в приложении didFinishLaunchingWithOptions

let coreSpotlightInstanceClass = CoreSpotlight()
    coreSpotlightInstanceClass.addCoreSpotLightAsObserverForItemInstallerNotifications()

По какой-то причине методы не отвечают на уведомления. заранее спасибо


person Gamaliel Tellez Ortiz    schedule 16.11.2015    source источник


Ответы (1)


Вы создаете свой экземпляр CoreSpotlight как локальную переменную внутри функции didFinishLaunchingWithOptions, поэтому, как только эта функция выйдет, объект будет освобожден.

Вы должны создать свойство экземпляра для хранения ссылки;

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    let spotlightHandler = CoreSpotlight()

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.

        self.spotlightHandler.addCoreSpotLightAsObserverForItemInstallerNotifications()
        return true
    }

Хотя ваш код был бы чище, если бы вы просто вызывали addCoreSpotLightAsObserverForItemInstallerNotifications (должен сказать, что это тоже довольно ужасное имя функции) в функции CoreSpotlight init. Тогда вам не нужно будет делать ничего, кроме создания экземпляра этого класса в сохраненной переменной.

person Paulw11    schedule 16.11.2015
comment
лол, да, мне нужно поработать над именами. что вы имеете в виду? Хотя ваш код был бы чище, если бы вы просто вызывали addCoreSpotLightAsObserverForItemInstallerNotifications - person Gamaliel Tellez Ortiz; 16.11.2015
comment
Если вы поместите содержимое addCoreSpotLightAsObserverForItemInstallerNotifications в метод init() для CoreSpotlight, то наблюдатель будет зарегистрирован в строке let spotlightHandler = CoreSpotlight(), и вам не понадобится код в didFinishLaunchingWithOptions. - person Paulw11; 16.11.2015
comment
В моем случае я создал объект в локальном методе, поэтому класс наблюдателя освобождается во время срабатывания уведомления из другого класса. Вы можете проверить это: работает в режиме выпуска, но работает в режиме отладки"> stackoverflow.com/questions/67328439/ - person Ravi; 30.04.2021