Ich habe eine lange laufende Aufgabe, die ich abgeschlossen werden soll, auch wenn die Anwendung in den Hintergrund geschoben wird. siehe Aus der Dokumentation kann ich, dass die Art und Weise, dies zu tun ist, um die beginBackgroundTaskWithExpirationHandler zu verwenden: Funktion und asynchron eine Aufgabe starten ausgeführt, wie im folgenden Code-Schnipsel:iOS: Wann wird der Hintergrund-Task-Code-Block aufgerufen?
UIApplication* application = [UIApplicationsharedApplication];
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
// Clean up any unfinished task business by marking where you.
// stopped or ending the task outright.
[application endBackgroundTask: bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do the work associated with the task, preferably in chunks.
for (int i = 0; i < 3; i++){
[self doChunkOfWork];
}
// end work
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
Jetzt verstehe ich, dass der zweite Codeblock asynchron ausgeführt wird und wenn die Anwendung fertig ist, wird sie benachrichtigt, und die Aufgabe wird als ungültig markiert. Kann mir jedoch jemand mitteilen, unter welchen Umständen der erste Codeblock ausgeführt wird und wie die ersten und zweiten Blöcke verknüpft werden? Ist es einfach so, dass, weil ich eine Aufgabe gestartet habe und sequentiell das nächste, was ich tue, dispatch_async heißt, dass die beiden Blöcke verknüpft werden?
Es ist erwähnenswert, dass, wenn all das oben genannte '' doChunkOfWork' 'noch läuft, das nächste Mal, wenn Ihre App im Hintergrund läuft, das System Ihnen keine zusätzliche Zeit gibt, weil Ihr Verfallshandler die Aufgabe bereits als erledigt markiert hat. Dies ist wahrscheinlich nicht das, was Sie wollen. –
Richtig! Aber wie schlagen Sie vor, dieses Problem zu lösen? – Dev
Kehren Sie die Aufgabe tatsächlich ab, wenn Sie vom Exspiration-Handler dazu aufgefordert werden. Wenn Sie eine 'NSOperation' verwenden, sollten Sie sie in [response to cancel] ändern (http://developer.apple.com/library/ios/documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html#//apple_ref/doc/uid/TP40004591-RH2-SW18) und rufen Sie 'cancel' von Ihrem Exspiration-Handler auf. Wenn Sie etwas tun, das in Ihrem Handler nicht blockierend ist, setzen Sie ein Flag, damit es abgebrochen wird und später mit einem neuen Aufruf von 'beginBackgroundTaskWithExpirationHandler:' neu gestartet wird. –