私のアプリには、オンラインデータベースからいくつかのコアデータ要素を更新するNSOperationがあり、更新に数分かかる場合があり、iPhoneの画面がロックされると、アプリがバックグラウンドモードに入り、この更新が停止するので、アプリを再度開いて更新を続行するには、SO で数分前にこれを尋ねたので、この正しい答えを受け取りました:
- (void)someMethodToKeepRunningInBackground {
UIBackgroundTaskIdentifier taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) {
// Uh-oh - we took too long. Stop task.
}];
// Perform task here
CheckForUpdate *checkUpdate = [[CheckForUpdate alloc] init];
[sectionCheckUpdateQueue addOperation:checkUpdate];
if (taskId != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:taskId];
}
}
問題は、更新を実行するために実行されるより多くの NSOperationQueue、上記で書いた sectionCheckUpdateQueue があることです。更新が見つかった場合、他の NSOperationQueue でより多くの NSOperation をスケジュールするため、これを呼び出すことはできません。
endBackgroundTask:taskId
この NSOperationQueue がいつ終了するかわからないので、私の質問は、この NSOperationQueue がいつ終了したかを検出して endBacgkround:taskId を呼び出すにはどうすればよいかということです。