Sejalan dengan jawaban saya untuk pertanyaan terkait , saya tidak akan setuju dengan BJ dan menyarankan Anda melihat GCD lebih dulu dari NSOperation / NSOperationQueue, kecuali yang terakhir menyediakan sesuatu yang Anda butuhkan, sedangkan GCD tidak.
Sebelum GCD, saya menggunakan banyak NSOperations / NSOperationQueues dalam aplikasi saya untuk mengelola konkurensi. Namun, sejak saya mulai menggunakan GCD secara teratur, saya hampir sepenuhnya mengganti NSOperations dan NSOperationQueues dengan blok dan mengirim antrian. Ini datang dari bagaimana saya menggunakan kedua teknologi dalam praktik, dan dari profil yang saya lakukan pada mereka.
Pertama, ada jumlah overhead nontrivial saat menggunakan NSOperations dan NSOperationQueues. Ini adalah objek Kakao, dan mereka perlu dialokasikan dan dialokasikan. Dalam aplikasi iOS yang saya tulis yang menjadikan adegan 3-D pada 60 FPS, saya menggunakan NSOperations untuk merangkum setiap frame yang diberikan. Ketika saya memprofilkan ini, pembuatan dan penghancuran NSOperations ini merupakan bagian penting dari siklus CPU dalam aplikasi yang sedang berjalan, dan memperlambat segalanya. Saya menggantinya dengan blok sederhana dan antrian serial GCD, dan overhead itu hilang, yang menyebabkan kinerja rendering yang lebih baik. Ini bukan satu-satunya tempat di mana saya perhatikan overhead menggunakan NSOperations, dan saya sudah melihat ini di Mac dan iOS.
Kedua, ada keanggunan untuk kode pengiriman berbasis blok yang sulit untuk dicocokkan ketika menggunakan NSOperations. Sangat nyaman untuk membungkus beberapa baris kode dalam satu blok dan mengirimkannya untuk dilakukan pada antrian serial atau bersamaan, di mana membuat NSOperation khusus atau NSInvocationOperation untuk melakukan ini memerlukan lebih banyak kode pendukung. Saya tahu bahwa Anda dapat menggunakan NSBlockOperation, tetapi Anda mungkin akan mengirim sesuatu ke GCD saat itu. Membungkus kode ini dalam blok sejalan dengan pemrosesan terkait dalam aplikasi Anda mengarah pada pendapat saya untuk organisasi kode yang lebih baik daripada memiliki metode terpisah atau NSOperations khusus yang merangkum tugas-tugas ini.
NSOperations dan NSOperationQueues masih memiliki kegunaan yang sangat baik. GCD tidak memiliki konsep dependensi yang nyata, di mana NSOperationQueues dapat mengatur grafik ketergantungan yang cukup kompleks. Saya menggunakan NSOperationQueues untuk ini dalam beberapa kasus.
Secara keseluruhan, sementara saya biasanya menganjurkan untuk menggunakan abstraksi tingkat tertinggi yang menyelesaikan tugas, ini adalah satu kasus di mana saya berdebat untuk API tingkat rendah GCD. Di antara pengembang iOS dan Mac saya sudah bicara dengan ini, sebagian besar memilih untuk menggunakan GCD lebih dari NSOperations kecuali mereka menargetkan versi OS tanpa dukungan untuk itu (sebelum iOS 4.0 dan Snow Leopard).