0

私の iOS アプリでは、バックグラウンド スレッドでかなり大量のデータをダウンロードしています。私がする必要があるのは、ユーザーがアプリを再度開いたときに、このタスクがまだ実行されているか、キャンセルされているかを何らかの方法で確認することです。

たとえば、ユーザーがホームボタンを押してからアプリに戻った場合、スレッドは続行されます。これは良いことです。しかし、何らかの理由でスレッドが OS によって破棄された場合はどうなるでしょうか。アプリの再開で、スレッドが実行されているかどうかを知るにはどうすればよいですか。

ありがとう!

いくつかのコード:

// Starts a background thread and also allows it to run in the background if the user exits app
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    UIBackgroundTaskIdentifier bgTask = 0;
    bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask:bgTask];
    }];

// Code here to run in background

// Tell the main thread its done, and also remove itself from background execution
dispatch_async( dispatch_get_main_queue(), ^{
    NSLog(@"Done with background thread");
    [self endBackgroundUpdateTask:bgTask];
});
4

1 に答える 1

0

まず、アプリがバックグラウンドに入ると、スレッド、フォアグラウンド、またはバックグラウンドが一時停止されます。バックグラウンドに移行して終了してクリーンアップするときに、少し時間をとるためにできることがいくつかあります。ただし、アプリが画面を離れると、「バックグラウンド」スレッドであるかどうかに関係なく、確実にシャットダウンされます。

つまり、ダウンロードが一時停止され、中断したところから正常に回復して再開する必要があります。そのためには、バックグラウンドに入ることが通知され、再開に使用できる状態をクリーンアップして保存するために余分な時間を許可するためにiOSが提供する手法を調査する必要があります。

これを調査してください:

   beginBackgroundTaskWithExpirationHandler

次に、backgroundTimeRemainingを使用して、許可された延長時間内に終了しようとするときに残っている時間を確認します。割り当てられた時間節約状態で終了できないことが明らかな場合は、再起動時に続行または最初からやり直す必要があることを示すフラグを設定します。iOSには、自分がやろうとしていたことを完了したかどうかを知る方法がないため、他に方法はありません。

于 2012-10-31T20:53:02.207 に答える