У меня есть контроллер вида, который использует NSTimer
для выполнения некоторого кода.
Какой лучший способ определить, когда приложение перейдет на задний план, чтобы я мог приостановить таймер?
У меня есть контроллер вида, который использует NSTimer
для выполнения некоторого кода.
Какой лучший способ определить, когда приложение перейдет на задний план, чтобы я мог приостановить таймер?
Вы можете заинтересовать любого класса, когда приложение переходит в фоновое уведомление. Это хорошая альтернатива сочетанию этих классов с AppDelegate.
При инициализации указанных классов:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillTerminate:) name:UIApplicationWillTerminateNotification object:nil];
Ответ на уведомления
-(void)appWillResignActive:(NSNotification*)note
{
}
-(void)appWillTerminate:(NSNotification*)note
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillResignActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillTerminateNotification object:nil];
}
В ваших приложениях AppDelegate метод (void)applicationDidEnterBackground:(UIApplication *)application
будет вызываться iOS. Вы можете остановить свой таймер там.
В Swift 3.0
override func viewDidLoad() {
super.viewDidLoad()
let app = UIApplication.shared
//Register for the applicationWillResignActive anywhere in your app.
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.applicationWillResignActive(notification:)), name: NSNotification.Name.UIApplicationWillResignActive, object: app)
}
func applicationWillResignActive(notification: NSNotification) {
}
Для тех, кто хочет сделать это в Swift:
Вкл init
:
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(applicationWillResignActive), name: UIApplicationWillResignActiveNotification, object: nil)
В deinit
:
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationWillResignActiveNotification, object: nil)
Отвечая на уведомление:
dynamic private func applicationWillResignActive() {
// Do things here
}
Apple поощряет нас избегать динамических диспетчеров и селекторов Objective-C, когда это возможно, в Swift, но это все еще самый удобный способ сделать это.
- (void)applicationWillResignActive:(UIApplication *)application
в вашем делете приложения. Вы также можете зарегистрироваться для уведомления UIApplicationWillResignActiveNotification
для других объектов.
Однако вам необязательно приостанавливать таймер. Если вы ничего не сделаете, приложение все равно будет спать и не будет выполнять какой-либо код. Предположительно, ваш таймер загорится, когда вы снова активируете (если вы это сделаете). Если вам нужно сделать что-то особенное, есть методы "стать активными" делегатами и уведомления, которые вы также можете зарегистрировать.
попробуйте это для SWIFT 3: В случае события didReceiveRemoteNotification в файле AppDelegate.
if application.applicationState == UIApplicationState.active {
// TODO ACTIVE APP
// Post notification
NotificationCenter.default.post(name: Notification.Name("MY_NAME_NOTIFICATION"), object: nil, userInfo: userInfo)
} else if application.applicationState == UIApplicationState.inactive {
// TODO INACTIVE APP
} else if application.applicationState == UIApplicationState.background {
// TODO BACKGROUND APP
}
И добавьте OBSERVER в FirstViewController
override func viewDidLoad() {
super.viewDidLoad()
let nc = NotificationCenter.default // Note that default is now a property, not a method call
nc.addObserver(self, selector: #selector(self.CallNotificationObserver), name:Notification.Name("MY_NAME_NOTIFICATION"), object: nil)
}