2012-04-03 20 views
10

Ho bisogno nella mia applicazione per scaricare le directory e il loro contenuto. Così ho deciso di implementare un NSOperationQueue e ho sottoclassato NSOperation per implementare NSURLRequest ecc ...iOS - Come sapere quando NSOperationQueue termina l'elaborazione di alcune operazioni?

Il problema è che aggiungo tutte le operazioni contemporaneamente e non riesco a capire quando tutti i file per una directory sono scaricati in ordine per aggiornare l'interfaccia utente e abilitare questa directory specifica.

Ora devo aspettare che tutti i file di tutte le directory vengano scaricati per aggiornare l'interfaccia utente.

Ho già implementato l'osservazione dei valori-chiave per l'operazioneCount di NSOperationQueue e l'isFinished di NSOperation ma non so quando una directory contiene tutti i file in essa contenuti!

Avete qualche idea?

Grazie mille

+0

E 'più comodo da usare dispatch_group_async. Vedere questo link [link] [1] [1]: http://stackoverflow.com/questions/9632235/how-do-i-know-all-my-tasks-in-grand-central -dispatch-finished – Igor

risposta

47

Aggiungere un "Fatto" NSOperation che ha tutti gli altri NSOperations per una directory come dipendenza.

Qualcosa di simile a questo:

NSInvocationOperation *doneOp = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(done:) object:nil]; 

NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomething:) object:nil]; 
[queue addOperation:op1]; 
[doneOp addDependency:op1]; 

NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomething:) object:nil]; 
[queue addOperation:op2]; 
[doneOp addDependency:op2]; 

NSInvocationOperation *op3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomething:) object:nil]; 
[queue addOperation:op3]; 
[doneOp addDependency:op3]; 

[queue addOperation:doneOp]; 

doneOp verrà eseguito solo dopo op1, op2 e op3 hanno terminato l'esecuzione.

+0

Ho dimenticato di dire che le mie operazioni sono concomitanti. Il tuo esempio è ancora ok? – Dabrut

+0

Naturalmente, questo è l'intero punto delle dipendenze. In una coda di operazioni non simultanee si dovrebbero semplicemente aggiungere le operazioni nell'ordine corretto per ottenere lo stesso risultato. Ma un'operazione non verrà eseguita finché tutte le sue dipendenze non avranno completato l'esecuzione. –

+0

Complimenti a te. Questo è esattamente quello che stavo cercando! – Dabrut

0

Un approccio potrebbe essere quello di creare una sorta di classe Directory con proprietà quali loadedCount (inizialmente 0) e FileCount (inizializzato a comunque molti file sono nella directory) e creare una mappatura dizionario ogni NSOperazione alla Directory appropriata prima di aggiungere l'operazione alla coda. All'interno del callback per isFinished, è possibile estrarre l'oggetto Directory per la specifica NSOperation dal dizionario e incrementare il file directory.loadedCount entro 1. Se il file directory.loadedCount == directory.fileCount, attiva un aggiornamento per l'interfaccia utente.

+0

Questa è stata la mia prima idea. Ma mi stavo chiedendo se quello fosse il modo corretto di farlo o se ci fosse un modo migliore per farlo. – Dabrut

0

È possibile rifattorizzare il codice per evitare di accodare tutte le richieste contemporaneamente. Accoda solo richieste per una singola directory alla volta. Quando lo operationCount raggiunge lo zero, puoi essere sicuro che tutte le richieste siano completate o fallite, aggiornare l'interfaccia utente e accodare le richieste per la directory successiva. Procedere finché la matrice delle directory non è vuota.

I vantaggi sono:

  • relativa semplicità
  • non si dispone di interrogare il sistema di file solo per capire cosa è stato scaricato
  • se necessario, è possibile ri-accodamento fallita richieste senza cambiare altra logica.
5
 
[opQueue operationCount] 

Spero che questo aiuti

Problemi correlati