Как лучше всего определить, когда приложение входит в фоновый режим для моего просмотра? - PullRequest
67 голосов
/ 26 января 2012

У меня есть контроллер представления, который использует NSTimer для выполнения некоторого кода.

Как лучше всего определить, когда приложение переходит в фоновый режим, чтобы я мог приостановить таймер?

Ответы [ 8 ]

158 голосов
/ 26 января 2012

Вы можете заинтересовать любой класс, когда приложение переходит в фоновый режим получения уведомлений. Это хорошая альтернатива соединению этих классов с 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];

}
23 голосов
/ 29 октября 2016

In Swift 4.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)
}

@objc func applicationWillResignActive(notification: NSNotification) {

}
9 голосов
/ 26 января 2012

В ваших приложениях AppDelegate метод (void)applicationDidEnterBackground:(UIApplication *)application будет вызываться iOS.Вы можете остановить свой таймер там.

7 голосов
/ 07 июля 2016

Для тех, кто хочет сделать это в 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, но это по-прежнему самый удобный способ сделать это.

2 голосов
/ 17 июля 2018

В быстром 4.1:

Я использую закрывающую версию:

var observer: NSObjectProtocol!

// inside init or viewDidLoad:
observer = NotificationCenter.default.addObserver(forName: .UIApplicationWillResignActive, object: nil, queue: nil) { _ in
    print("willResignActive")
}

deinit {
    NotificationCenter.default.removeObserver(observer)
}

Метод addObserver возвращает непрозрачный объект, который необходимо удалить в какой-то момент.

0 голосов
/ 25 июня 2018

Swift 4:

init() {
    NotificationCenter.default.addObserver(self,
                                           selector: #selector(applicationWillResignActive),
                                           name: NSNotification.Name.UIApplicationWillResignActive,
                                           object: nil)
}

deinit {
    NotificationCenter.default.removeObserver(self,
                                              name: NSNotification.Name.UIApplicationWillResignActive,
                                              object: nil)
}

@objc private func applicationWillResignActive() {
    self.header.blur.effect = nil
}
0 голосов
/ 08 апреля 2018

только примечание: Если вы регистрируете контроллер A, чтобы получать уведомления о фоновом режиме, будьте осторожны, так как он будет вызываться, даже если вы (например, ..) нажмете второй контроллер B и у вас отображается B: Если это поведение некорректно, лучше зарегистрироваться / отменить регистрацию в

didAppear / WillDisappear.

0 голосов
/ 26 января 2012

- (void)applicationWillResignActive:(UIApplication *)application в вашем приложении делегата. Вы также можете зарегистрироваться для уведомления UIApplicationWillResignActiveNotification о других объектах.

Вам не обязательно останавливать таймер. Если вы ничего не сделаете, приложение все равно будет усыплено и не будет выполнять какой-либо код. Предположительно ваш таймер сработает, когда вы снова станете активными (если вы это сделаете). Если вам нужно сделать что-то особенное, есть методы и уведомления «действительно стали активными», на которые вы также можете зарегистрироваться.

...