Как удалить прослушиватель firestore при использовании контроллера представления вкладок? - PullRequest
0 голосов
/ 28 января 2020

Итак, у меня есть контроллер с именем MessagesController, который является частью контроллера панели вкладок. MessagesController постоянно слушает данные в реальном времени из магазина. Поскольку контроллер на панели вкладок никогда не будет убит (если пользователь не убивает приложение), мне было интересно, как эффективно использовать слушатель?

Вызывается ли deinit при входе приложения в фоновый режим? Должен ли я использовать уведомление appWillResign для удаления слушателя?

override func viewDidLoad() {
    super.viewDidLoad()

    //Register for the applicationWillResignActive anywhere in your app.
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.applicationWillResignActive(notification:)), name: NSNotification.Name.UIApplicationWillResignActive, object: app)
}

@objc func applicationWillResignActive(notification: NSNotification) {
    listener.remove()
}

Или я должен просто оставить его, не удаляя его? Это влияет на батарею? Это всего лишь один слушатель.

1 Ответ

1 голос
/ 28 января 2020

Как сказано в документации Firestore, когда вы больше не заинтересованы в прослушивании ваших данных, отключите прослушиватель. Если ваше приложение не настроено для работы в фоновом режиме или вы не хотите, вы не должны слушать данные и обновлять пользовательский интерфейс. Также учтите, что приложение, скорее всего, будет убито ОС, если оно выполняет работу в фоновом режиме, а не приложением, которое этого не делает. И с экономической точки зрения вы тратите деньги, платя за чтения, которые никто никогда не увидит. При повторном входе на передний план и повторном подключении слушателя он немедленно запускается с данными fre sh (сначала кэшируется, а затем кэшируется, который вы можете отфильтровать).

Самый простой способ обработки ввода приложения и Выход из фона из контроллера представления - это следующая пара уведомлений:

NotificationCenter.default.addObserver(self, selector: #selector(appDidEnterBackgroundHandler(_:)), name: UIApplication.didEnterBackgroundNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(appWillEnterForegroundHandler(_:)), name: UIApplication.willEnterForegroundNotification, object: nil)

И если вы когда-нибудь захотите узнать, когда деинициализирован объект (а не только контроллеры представления), вы можете распечатать его методом deinit. :

class YourViewController: UIViewController {

    deinit {
        print("deinit")
    }

}

Это сообщит вам, деинициализирован ли контроллер представления. Если контроллер представления является root вкладки (а это главная панель вкладок приложения), он никогда не будет деинициализирован. Но если это не root контроллер представления вкладки - например, он был выдвинут навигационным контроллером на вкладке - тогда он прекратит работу при нажатии.

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