2012-09-04 18 views
6

Se si scarica un file di grandi dimensioni in un'app viene spostato sullo sfondo, esiste un modo per mantenere attive le funzioni di esecuzione del download?iOS: Termina un'attività quando si immette lo sfondo

So che beginBackgroundTaskWithExpirationHandler: viene chiamato quando l'app si sposta sullo sfondo e posso avviare il mio compito lì, ma non voglio iniziare una nuova attività, voglio completare il mio vecchio compito. Può essere risolto con beginBackgroundTaskWithExpirationHandler:, ma per quello ho bisogno di mettere in pausa il mio download e riprenderlo dal posto giusto, che è semplicemente sciocco.

Idealmente quello che voglio è che avvolgo la mia funzione di download con un gestore di scadenza, quindi la mia funzione di download continua ad essere eseguita per il tempo consentito dopo che l'app è stata spostata sullo sfondo.

+1

http://stackoverflow.com/questions/9136890/how-should-beginbackgroundtaskwithexpirationhandler-be-dealt-with-for-an-nsurlc/9137656#9137656 – user523234

+0

Grazie, suppongo che sia un po 'più di lavoro allora. – SMK

risposta

6

Idealmente quello che voglio è che mi avvolgo la mia funzione di download con un gestore di scadenza, quindi la mia funzione di download mantiene esecuzione per il tempo consentito dopo l'applicazione è stata spostata in secondo piano.

Questo è esattamente come funziona. beginBackgroundTaskWithExpirationHandler: non viene chiamato quando si inserisce lo sfondo. È quello che si chiama per indicare che stai iniziando qualcosa che, , se ti capita di andare in background mentre è in esecuzione, vuoi finire. È sufficiente avvolgere il codice di download esistente con beginBackgroundTaskWithExpirationHandler: e endBackgroundTask:.

+0

Hai ragione, avrei dovuto leggere meglio la documentazione! – SMK

-3

È perfettamente necessario avviare un thread in background quando ci si trova in forground. Aggiungi il tuo gestore di scadenza personalizzato. Fai una richiesta asincrona.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
             (unsigned long)NULL), ^(void) { 
    [self performYourStuffInTheBackGround]; 
}); 

E una citazione da AppleDEV;

probabilmente vorrai utilizzare API di rete asincrone. iOS offre una vasta gamma di API per fare ciò: dalle API di basso livello come GCD alle API di alto livello come NSURLConnection, con molte fermate intermedie, e ti incoraggiamo a utilizzarle.

Problemi correlati