Il punto di essere fatta qui è la stessa che Chris Hanson afferma nel suo articolo "When to use NSOperation vs. GCD":
La risposta semplice è una linea guida generale per tutte le applicazioni sviluppo:
Usa sempre il l'astrazione di livello più alto a tua disposizione e rilasciare nelle astrazioni di livello inferiore quando la misurazione mostra che sono necessarie .
In questo caso particolare, significa che durante la scrittura di applicazioni Cocoa , in genere si dovrebbe utilizzare NSOperation anziché utilizzando GCD direttamente. Non a causa di una differenza di efficienza, ma perché NSOperation fornisce un'astrazione di livello superiore in cima ai meccanismi di GCD.
In generale, sono d'accordo con questo.NSOperation e NSOperationQueue forniscono supporto per le dipendenze e una o due altre cose che i blocchi e le code GCD non hanno e sottraggono i dettagli di livello inferiore di come vengono implementate le operazioni simultanee. Se hai bisogno di quella funzionalità, NSOperation è un ottimo modo per andare.
Tuttavia, dopo aver lavorato con entrambi, mi sono trovato a sostituire tutto il mio codice basato su NSOperation con blocchi e code GCD. L'ho fatto per due motivi: c'è un sovraccarico significativo quando si usa NSOperation per azioni frequenti, e credo che il mio codice sia più pulito e più descrittivo quando si usano i blocchi GCD.
La prima ragione viene da profilatura nelle mie applicazioni, dove ho trovato che il processo oggetto di allocazione e deallocazione NSOperation ha preso una notevole quantità di risorse della CPU quando si tratta di piccoli e frequenti azioni, come il rendering di un fotogramma OpenGL ES per lo schermo. GCD blocca completamente l'overhead, portando a significativi miglioramenti delle prestazioni.
Il secondo motivo è più soggettivo, ma credo che il mio codice sia più pulito quando si usano i blocchi di NSOperations. L'acquisizione rapida di scope consentita da un blocco e la natura inline di esse rendono meno codice, perché non è necessario creare sottoclassi NSOperation personalizzate o raggruppare i parametri da passare all'operazione e codice più descrittivo secondo me, perché è possibile inserire il codice da eseguire in una coda nel punto in cui è stato sparato.
Ancora una volta, è una questione di preferenza, ma mi sono trovato a usare GCD di più, anche in applicazioni Cocoa altrimenti più astratte.
https: // cocoacast.com/choose-between-nsoperation-and-grand-central-dispatch/ – Masih