2016-06-16 1 views
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はなぜコードを実行できますか?

ありがとうございます。

+0

「bgTask」の宣言を表示できますか?それはインスタンス変数ですか?私はあなたがブロックでキャプチャすることは、値ではなく、参照ではないことを除外しようとしています。 – Tommy

+0

サンプルではivarですが、ローカルの '__block'変数でも同じ結果になると思います –

+3

Xcodeのデバッガで実行中にテストしていますか?もしそうなら、あなたはアプリにバックグラウンドの時間制限がなく、中断されます – Paulw11

答えて

0

Xcodeで、デバッガの下で実行中にテストされたコメントで@Paulw11

あたりのよう?そうであれば、アプリにはバックグラウンドの時間制限が適用されないか、中断されます。

私は何の証拠も見つけられませんでしたが、経験的な調査を通して、それは正しいと思われます。

関連する問題