In linea con la mia risposta a una domanda correlata , non sono d'accordo con BJ e suggerisco di dare prima un'occhiata a GCD su NSOperation / NSOperationQueue, a meno che quest'ultimo non fornisca qualcosa di cui GCD non ha bisogno.
Prima di GCD, ho usato molte NSOperations / NSOperationQueues nelle mie applicazioni per gestire la concorrenza. Tuttavia, da quando ho iniziato a utilizzare GCD su base regolare, ho quasi completamente sostituito NSOperations e NSOperationQueues con blocchi e code di invio. Questo deriva dal modo in cui ho usato entrambe le tecnologie nella pratica e dalla profilazione che ho eseguito su di esse.
Innanzitutto, esiste un importo non banale di spese generali quando si utilizzano NSOperations e NSOperationQueues. Questi sono oggetti di cacao e devono essere allocati e deallocati. In un'applicazione iOS che ho scritto che esegue il rendering di una scena 3D a 60 FPS, stavo usando NSOperations per incapsulare ogni fotogramma renderizzato. Quando ho profilato questo, la creazione e lo smontaggio di queste NSOperations rappresentavano una parte significativa dei cicli della CPU nell'applicazione in esecuzione e rallentavano le cose. Li ho sostituiti con blocchi semplici e una coda seriale GCD, e quell'overhead è scomparso, portando a prestazioni di rendering notevolmente migliori. Questo non è stato l'unico posto in cui ho notato spese generali dall'uso di NSOperations, e l'ho visto sia su Mac che su iOS.
In secondo luogo, c'è un'eleganza al codice di spedizione basato su blocchi che è difficile da abbinare quando si utilizzano NSOperations. È incredibilmente conveniente racchiudere alcune righe di codice in un blocco e inviarlo per eseguirlo su una coda seriale o simultanea, dove la creazione di un NSOperation o NSInvocationOperation personalizzato per fare ciò richiede molto più codice di supporto. So che puoi usare un NSBlockOperation, ma potresti anche inviare qualcosa a GCD. Avvolgere questo codice in blocchi in linea con l'elaborazione correlata nella tua applicazione porta a mio avviso a una migliore organizzazione del codice rispetto a metodi separati o NSOperations personalizzate che incapsulano queste attività.
NSOperations e NSOperationQueues hanno ancora ottimi utilizzi. GCD non ha un vero concetto di dipendenze, in cui NSOperationQueues può impostare grafici di dipendenze piuttosto complessi. Uso NSOperationQueues per questo in una manciata di casi.
Nel complesso, mentre di solito sostengo l'utilizzo del massimo livello di astrazione che compie il compito, questo è un caso in cui sostengo per l'API di livello inferiore di GCD. Tra gli sviluppatori iOS e Mac di cui ho parlato di questo, la stragrande maggioranza sceglie di utilizzare GCD su NSOperations a meno che non stiano prendendo di mira le versioni del sistema operativo senza supporto (quelle precedenti a iOS 4.0 e Snow Leopard).