У меня есть контроллер вида, который использует 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)
   }