2013-03-07 15 views
9

Ho lavorato a un'app in cui l'utente può registrare video utilizzando AVFoundation e inviare al server, il video ha dimensioni massime fino a 15 M, a seconda della velocità di Internet & tipo che può richiedere Da 1 a 5 minuti circa per trasferire video sul server. Sto trasferendo il video registrato sul server nel thread in background in modo che l'utente possa continuare altre cose sull'app mentre il video viene caricato sul server.Implementazione di attività a esecuzione prolungata in background IOS

Durante la lettura di Apple Docs per implementing long running tasks in backround, vedo che solo alcuni tipi di app possono essere eseguiti in background.
ad es.

audio-L'app riproduce il contenuto udibile all'utente in background. (Questo contenuto include lo streaming di contenuti audio o video usando AirPlay.)

Qualifica la mia app anche per eseguire le attività in background? o ho bisogno di trasferire il video sul thread principale?

+0

ru andando a caricare il video in background? – Ganapathy

+0

sì, questo è quello che sto facendo, motivo per cui ho detto che voglio che l'utente continui a fare altre cose sul modulo mentre il video è in fase di registrazione – nsgulliver

+0

Durante il caricamento, l'app sarà in primo piano (eseguirà qualche altra attività) o entrerà in lo sfondo completamente? – Ganapathy

risposta

13

NSOperationQueue è il metodo consigliato per eseguire attività multi-thread per evitare il blocco del thread principale. Il thread in background viene utilizzato per le attività che si desidera eseguire mentre l'applicazione è inattiva, ad esempio indicazioni GPS o streaming audio.

Se l'applicazione è in esecuzione in primo piano, non è necessario il thread in background.

Per semplici operazioni, è possibile aggiungere un'operazione a una coda utilizzando un blocco:

NSOperationQueue* operationQueue = [[NSOperationQueue alloc] init]; 
[operationQueue addOperationWithBlock:^{ 
    // Perform long-running tasks without blocking main thread 
}]; 

Maggiori informazioni su NSOperationQueue e how to use it.

Il processo di caricamento continuerà mentre è in background, ma la tua applicazione sarà idonea per essere sospesa, e quindi il caricamento potrebbe annullarsi. Per evitarlo, è possibile aggiungere il seguente codice di delegare applicazione per dire al sistema operativo quando l'applicazione è pronta per essere sospesa:

- (void)applicationWillResignActive:(UIApplication *)application { 
    bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ 

     // Wait until the pending operations finish 
     [operationQueue waitUntilAllOperationsAreFinished]; 

     [application endBackgroundTask: bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 
} 
+0

significa che se l'utente fa clic sul pulsante di accensione e 'NSOperationQueue' continuerà le sue attività? – nsgulliver

+0

Vedere la risposta aggiornata per evitare che l'app venga sospesa mentre è inattiva. – redent84

+0

Aggiungere il segno '*' a NSOperationQueue '*' operationQueue – Salim

4

Il vostro requisito si qualifica per l'esecuzione in background. Non è necessario registrare alcuna modalità di background supportata nelle informazioni plist. Tutto quello che devi fare è, quando l'app sta per entrare in background, richiedere un tempo aggiuntivo usando il gestore di attività in background ed eseguire l'attività in quel blocco. Assicurati di fermare il tuo gestore prima di 10 minuti in modo da non ottenere la forza terminata dal sistema operativo.

È possibile utilizzare il codice riportato di seguito da Apple.

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
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. 

    [application endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid; 
});} 
+0

da Apple Docs non è chiaro, è per questo che ho chiesto, sto già implementando il mio processo di caricamento nella thread in background e sto già utilizzando il multitasking, my domanda è che farà rifiutare la mia app se è già in esecuzione nel thread in background? in secondo luogo la mia app può essere in stato attivo o inattivo, non importa perché sta eseguendo le attività nel thread in background. – nsgulliver

+1

@nsgulliver No. Apple non rifiuterà perché si carica utilizzando il gestore dello sfondo. Tutto quello che devi fare è assicurarti di fermare il gestore prima che 10 minuti di tempo non siano in grado di terminare forzatamente l'applicazione dal sistema operativo. L'ho fatto in alcune applicazioni e non ho avuto alcun problema con Apple. – Ravi

5

Dalla tua risposta a Dwayne, non è necessario essere in grado di scaricare in modalità background. Piuttosto, quello di cui hai bisogno è scaricare il file in un altro thread (thread in background) accanto al thread principale. Qualcosa del genere per GCD:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
//  Do you download here... 
    }); 
+0

sta caricando dati sul server e, la mia preoccupazione è che se internet andasse giù e diventasse disponibile dopo un po ', riprenderà i miei compiti? dovrò aggiungere le attività in NSOperationQueue come ho capito e se sono in sospeso possono riprendere? – nsgulliver

+1

Se la tua attività di caricamento sarà in grado di riprendere o meno dopo aver perso la connessione al server dipenderà dalla libreria che stai utilizzando avrebbe questa caratteristica. L'esecuzione di un'attività come attività in background o in un thread in background non sarebbe di aiuto se quella libreria non supporta quella funzione. – user523234

+0

e quali sono quelle librerie che hanno la capacità di riprendere e quali no? – nsgulliver

Problemi correlati