2013-07-02 14 views
14

Ho letto la documentazione Apple su come utilizzare le code seriali per garantire che le attività vengano eseguite in un ordine prevedibile, ma ora sono troppo confuso.
Alcuni come sono in grado di lavorare in serie ma ancora non sono chiaro quindi ho bisogno di un semplice esempio seriale per i miei metodi da eseguire in serie.Esempio di coda seriale GCD semplice come FIFO utilizzando i blocchi

ho diviso la mia funzionalità in 4 parti e ora vogliono loro di eseguire in serie

[self ReadAllImagesFromPhotosLibrary]; 

[self WriteFewImagestoDirectory]; 

[self GettingBackAllImagesFromFolder]; 

[self MoveToNextView]; 
+0

Se si è soddisfatti di una delle risposte di seguito, contrassegnarla come risposta corretta. – Benjamin

risposta

1

È possibile utilizzare NSOperationQueue con maxConcurrentOperationCount set a 1 (o anche impostare la dipendenza per ciascun NSOperation, in modo che non si avvia prima che la sua dipendenza sia finita).

Qui è NSOperationQueue Riferimento di classe.

Anche dare un'occhiata a this domanda.

3
dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL); 

dispatch_async(serialQueue, ^{ 
     [self ReadAllImagesFromPhotosLibrary]; 
      dispatch_async(serialQueue, ^{ 
        [self WriteFewImagestoDirectory]; 
        dispatch_async(serialQueue, ^{ 
         [self GettingBackAllImagesFromFolder]; 
         dispatch_async(serialQueue, ^{ 
           [self MoveToNextView]; 
         }); 
        }); 
       }); 
    }); 

Penso che il codice sopra dovrebbe funzionare, ma assicurati che le operazioni di interfaccia utente siano eseguite nel thread principale. Spero che sia d'aiuto.

+0

cosa? che ne dici di una spedizione asincrona con 4 chiamate di metodo? (fa la stessa cosa) – dcow

+0

Non ha senso inviare le chiamate in modo ricorsivo. È inutile in testa. – Karsten

+0

il "com.unique.name.queue" potrebbe essere adatto a qualcosa? Ancora perché lo hai chiamato così? cosa significa ** com **? – Honey

1

Non sono a conoscenza dell'API esistente per fare lo stesso con i blocchi, se presenti.

Ma lo stesso può essere fatto definendo i blocchi (che rappresentano le operazioni che si desidera) in modo tale che puntino al blocco successivo per procedere se ce ne sono. Inoltre, puoi mettere l'intera elaborazione in una coda separata.

frammento per avere blocchi di esecuzione in modo seriale

BLOCK A(NEXT BLOCK reference){ 
->Do the the required Task 
->If(next Block reference) 
--->Then call that block 
->Else 
--->Exit or have a callback on mainthread 
} 
0

perché non provare il MCD, garantisce la sequenza di operazioni e ha anche la sincronizzazione e le tue capacità asincrone

37

al follow-up e migliorare iCoder Risposta, si potrebbe e dovrebbe fare quanto segue.

dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL); 

dispatch_async(serialQueue, ^{ 
     [self ReadAllImagesFromPhotosLibrary]; 
    }); 
dispatch_async(serialQueue, ^{ 
     [self WriteFewImagestoDirectory]; 
}); 
dispatch_async(serialQueue, ^{ 
    [self GettingBackAllImagesFromFolder]; 
}); 
dispatch_async(serialQueue, ^{ 
    [self MoveToNextView]; 
}); 

Nonostante le chiamate di cui sopra essendo asincrona, saranno in coda ed eseguire in serie le DISPATCH_QUEUE_SERIAL stati. La differenza tra sincronizzazione e asincrona è che con sincronizzazione, il codice farà una pausa e attendere per la risposta di blocco prima di eseguire il codice riportato di seguito, quindi, potenzialmente, il congelamento l'interfaccia utente, se il tempo di esecuzione è lungo. Mentre con async, il codice viene eseguito e il blocco viene restituito in modo asincrono.

Tuttavia, i compiti che avete memorizzato nel DISPATCH_QUEUE_SERIAL aspettiamo e saranno eseguiti uno dopo l'altro nell'ordine in cui sono stati aggiunti, grazie al GCD (Grand Central Dispatch).

-1

Ho avuto qualche successo con un modello come questo in una caccia simile in Swift 3.0 ...

let serialQueue = DispatchQueue.init(label: "com.foo.bar") 

serialQueue.sync {self.readAllImagesFromPhotosLibrary()} 

serialQueue.sync {self.rriteFewImagestoDirectory()} 

serialQueue.sync {self.gettingBackAllImagesFromFolder()} 

serialQueue.sync {self.moveToNextView()}