Как получить объект из других классов в appDelegate, когда приложение входит в фон
У меня есть класс, который запускает несколько таймеров, и когда приложение переходит в фоновый режим, я хочу остановить их. Я знаю, конечно, это делается в appDelegate, но когда я получил timer
класс, инициализированный как переменная экземпляра в другом классе. Каковы общие способы получения объекта экземпляра в appDelegate?
Я делегирую didEnterBackground
в класс с таймером я хочу остановиться?
Я делаю таймер сингелтон?
Использовать центр уведомлений?
или, надеюсь, есть лучшие способы, чем это!
2 ответа
Вероятно, самое простое, что можно сделать здесь, это опубликовать уведомление, когда ваш делегат приложения получитdidEnterBackground:
"вызов. И ваш класс таймера (или класс, у которого есть куча таймеров) прослушивает это уведомление.
Вам понадобится соответствующий метод app-Delegate-Do-A-Post, если вы хотите перезапустить таймеры, когда приложение вернется в fireground.
Вы правы - вам нужен только один метод didEnterBackground
Метод в вашем приложении Delegate.
Использование центра уведомлений может вызвать массу проблем (вы на 100% уверены, что каждый раз, когда приложение входит в фоновый режим, в вашем классе будут срабатывать таймеры?). Центр уведомлений в этом случае может легко вызвать сбой.
Вот что я сделаю:
- Установите мои таймеры в одном классе (давайте назовем это
TimerManager
) - Сделайте мой класс уроком Singleton.
- В
TimerManager
Я создам массив / набор с таймерами. - Вызвать одноэлементный класс сразу после загрузки моих первых ViewControllers (или в AppDelegate). В основном сразу после того, как мое приложение запустится.
- добавлять
Timers
в мой набор / массив, когда мне это нужно. - Создать метод
stopAllTimers
\
-(void)stopAllTimers {
for(NSTimer *timer in self.allTimers) {
[timer invalidate];
}
}
- Назовите этот метод в моем
didEnterBacground
:[[TimerManager sharedInstance] stopAllTimers]
Вот и все, и это совершенно безопасно.