0

applicationDidEnterBackgroundで誰かが実行シーケンスを説明できますか?

UIBackgroundTaskIdentifier background_task;
background_task = [application beginBackgroundTaskWithExpirationHandler: ^ {

    [application endBackgroundTask: background_task]; 
    background_task = UIBackgroundTaskInvalid; 
}];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSLog(@"\n\nRunning in the background!\n\n");
    [application endBackgroundTask: background_task]; 
    background_task = UIBackgroundTaskInvalid; 
});

私の理解は

  1. バックグラウンド タスクの識別子を作成し、1 回 (10 分程度) に一度呼び出されるブロックを割り当てます。
  2. 非同期メソッドをディスパッチし、NSLog を出力します。この間、アプリの他のすべての方法を使用できます
  3. NSLog out の直後にバックグラウンド タスクを終了し、システムのデフォルトの有効期限を待たずに

具体的には、NSLog を呼び出した後

[application endBackgroundTask: background_task]; 
background_task = UIBackgroundTaskInvalid; 

タスクは終了し、expirationHandler ブロックは呼び出されません。

私の認識も間違っていると思います...

4

1 に答える 1

2

あなたの投稿に関するすべては、1 つの重要な詳細を除いて、基本的に正しいです。applicationDidEnterBackgroundこれは、アプリのデリゲート メソッドとは何の関係もありません。

数秒以上かかる可能性のあるアプリ内のタスクは、 と の呼び出し内にラップする必要がbeginBackgroundTaskWithExpirationHandlerありendBackgroundTaskます。

これら 2 つの方法でコードをラップすることの要点は、実行中にアプリがたまたまバックグラウンドに入った場合でも、実行し続ける必要がある処理があることを OS に通知することです。これらのブロックがないと、アプリはバックグラウンドで実行しようとしてから数秒 (10?) 秒後に OS によって強制終了されます。

于 2013-03-09T06:38:57.870 に答える