2012-11-26 16 views
7

in meiner App eingegeben habe ich einige NSOperation, die einige Kerndatenelement von einer on-line-Datenbank aktualisieren, irgendwann das Update erfordern einige Minute, und wenn der Bildschirm von iPhone sperren, die APP betreten in Hintergrundmodus, und dieses Update gestoppt ist, so habe ich die App wieder zu öffnen, um das Update fortzusetzen, so habe ich viel auf Stack-Überlauf suchen, und ich habe einige Informationen über:Operation fortsetzen, wenn App Hintergrund auf iOS

beginBackgroundTaskWithExpirationHandler 

, die ein Verfahren ist aus Apfel, der einige Aufgabe fortsetzen kann, auch wenn die App im Hintergrundmodus ist, und ich habe dies tun:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 

UIApplication *app = [UIApplication sharedApplication]; 
UIBackgroundTaskIdentifier bgTask; 

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
    [app endBackgroundTask:bgTask]; 
}]; 
} 

und jetzt die App die Aufgabe im Hintergrund fortsetzen, und scheint, dass alles gut funktioniert, so ist meine Frage, ist diese Methode, die ich benutze, sicher? oder gibt es einen besseren Modus?

danke

+1

Überprüfen Sie die Antwort hier gepostet .. http://StackOverflow.com/Questions/12071726/how-to-use-beginbackgroundtaskwithexpirationhandler-for-already-running-task-in – iDev

Antwort

12

So geht das nicht. Jeder Code, den Sie im Hintergrund ausführen möchten, muss ordnungsgemäß umgebrochen werden. Etwas wie folgt aus:

- (void)someMethodToKeepRunningInBackground { 
    UIBackgroundTaskIdentifier taskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) { 
     // Uh-oh - we took too long. Stop task. 
    }]; 

    // Perform task here   

    if (taskId != UIBackgroundTaskInvalid) { 
     [[UIApplication sharedApplication] endBackgroundTask:taskId]; 
    } 
} 

Sie tun nichts in der UIApplicationDelegate applicationDidEnterBackground: Methode.

Alle Aufgaben, die in den "Hintergrundaufgaben" -Aufrufen enthalten sind, können weiter ausgeführt werden, wenn die App in den Hintergrund tritt.

Hier ist der wirklich wichtige Teil - die Aufgabe wird nur 10 Minuten maximal. Wenn es nach 10 Minuten noch läuft, wird Ihre App beendet. Der Verfallshandler gibt Ihnen einige Sekunden, um die Aufgabe sauber zu beenden, bevor die App nicht ordnungsgemäß beendet wird.

+0

Ja, ich suche im Internet, dass ich dachte, dass die lösung war, dass du gerade geschrieben hast, aber der code, den ich in meine frage geschrieben habe funktioniert, ich weiß nicht wie, aber wenn ich das update starte, dann drücke ich den home button, wenn ich die app ein paar minuten später das update öffne ist richtig fertig, wie erklärst du das? – Piero

+0

Der von Ihnen gepostete Code funktioniert, aber Ressourcen werden verschwendet. Wie bereits erwähnt, teilt Ihr Code dem Betriebssystem mit, dass jedes Mal, wenn die App in den Hintergrund tritt, die vollen 10 Minuten erhalten bleiben sollten, um im Hintergrund am Leben zu bleiben. Wenn die Zeit abgelaufen ist, weisen Sie das Betriebssystem an, die Hintergrundaktivität zu beenden. So sitzt Ihre App jedes Mal, wenn sie in den Hintergrund tritt, 10 Minuten lang aktiv im Hintergrund, unabhängig davon, wie wenig Zeit tatsächlich benötigt wird, um den Prozess abzuschließen. Ihre App entfernt während dieser Zeit unnötig Ressourcen von anderen Apps. Es funktioniert, aber es ist ein schlechter Ansatz. – rmaddy

+0

ok jetzt verstehe ich Dank, also in jedem Teil des Codes, den ich will (nicht unbedingt in der Didenterbackground-Methode) benutze ich den Code, den Sie in der Lösung schreiben, und ich muss den Code schreiben, die auch im Bacgkround-Modus nach zwischen der // Perferom Aufgabe hier und if (taskId! = UIBackgroundTaskInvalid) .... oder? – Piero

Verwandte Themen