Swift - это правильное место для вызова .removeObserver всегда deinit ()? - PullRequest
0 голосов
/ 20 ноября 2018

Новый пользователь StackOverflow здесь (первая публикация, долгое время скрывавшаяся без учетной записи).Прежде чем я начну, вот некоторые ранее отвеченные вопросы, которые я нашел полезными, но не полностью решил мою проблему:

Как безопасно удалить Observer (Swift)

Правильное место для вызова .removeObserver для NSNotificationCenter = Swift deinit ()?

Из них я создал контроллер BaseView, с помощью которого можно управлять поведением моего приложения при различных обстоятельствах (например,вызов API для проверки обновлений при возврате приложения на передний план)

class BaseViewController : UIViewController {

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    NotificationCenter.default.addObserver(self, selector: #selector(applicationWillEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(applicationDidEnterBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
}

@objc func applicationWillEnterForeground() {

}

@objc func applicationDidEnterBackground() {

}

deinit {
    print("WORKING - deinit BaseViewController")
    NotificationCenter.default.removeObserver(self, name: UIApplication.willEnterForegroundNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIApplication.didEnterBackgroundNotification, object: nil)
}

}

Однако моя проблема заключается в том, что мне необходимо использовать других наблюдателей NotificationCenter для динамического управления панелью навигации (прогресс), котораязависит от того, где в приложении находится пользователь (и что они там делают, в отрыве от других областей).

Мой вопрос: "Является ли правильное место для вызова .removeObserver всегда deinit ()? " или, если нет, есть ли какие-нибудь ключевые места, где следует рассмотреть возможность добавления вызовов .removeObserver?

Если это помогает, панель навигации для каждого раздела приложения присоединяется к MainPagerVC (UIPageViewController), который используется повторно и включается и выключается с помощью LGSideMenuController

1 Ответ

0 голосов
/ 20 ноября 2018

В вашем случае вы должны удалить наблюдателей в viewWillDisappear

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    NotificationCenter.default.removeObserver(self, name: UIApplication.willEnterForegroundNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIApplication.didEnterBackgroundNotification, object: nil)
}
...