1
は限り私が知っている、iOSアプリケーションのライフサイクルの二つの異なるステージがありますなぜアプリケーションが中断されている間、NSTimerは起動し続けますか?それが隠されているとき
- 背景 - 我々はまだ計算して実行コードを続行することができます。
- 一時停止 - 計算が凍結され、ユーザーがアプリに戻るまで何もできません。
だから私は、次の例について少し困惑している:
- (void)applicationDidEnterBackground:(UIApplication *)application {
(void)(^expirationHandler)() = [^{
[application endBackgroundTask:bgTask];
self.bgTask = UIBackgroundTaskInvalid;
} copy];
self.bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:expirationHandler];
[NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(count)
userInfo:nil
repeats:YES];
expirationHandler();
}
- (void)count {
int i = 0;
while (i < 10000000) {
i++;
}
NSLog(@"%d", i);
}
P.S.私は記憶からそれを再現しましたが、何か間違っているかどうか教えてください。しかし、問題はスニペットの正確さに関係していません。
iOS 9.3でiPhone 6+でテストし、指定されたタイマーが起動し続け、さらにカウントメソッドがコードを実行します(i
の値で確認できます)。タイマー予約後、アプリは一時停止状態に移行する必要がありますか?もしそうなら、count
はなぜコードを実行できますか?
ありがとうございます。
「bgTask」の宣言を表示できますか?それはインスタンス変数ですか?私はあなたがブロックでキャプチャすることは、値ではなく、参照ではないことを除外しようとしています。 – Tommy
サンプルではivarですが、ローカルの '__block'変数でも同じ結果になると思います –
Xcodeのデバッガで実行中にテストしていますか?もしそうなら、あなたはアプリにバックグラウンドの時間制限がなく、中断されます – Paulw11