İlgili bir soruya cevabım doğrultusunda, BJ ile aynı fikirde olmayacağım ve GCD'ye ihtiyacınız olmayan bir şey sağlamadığı sürece öncelikle NSOperation / NSOperationQueue üzerinden GCD'ye bakmanızı öneririm.
GCD'den önce, eşzamanlılığı yönetmek için uygulamalarımda çok sayıda NSOperations / NSOperationQueues kullandım. Bununla birlikte, GCD'yi düzenli olarak kullanmaya başladığımdan beri, neredeyse tamamen NSOperations ve NSOperationQueues'ı bloklar ve dağıtım kuyruklarıyla değiştirdim. Bu, her iki teknolojiyi de pratikte nasıl kullandığımdan ve üzerinde gerçekleştirdiğim profilden geldi.
İlk olarak, NSOperations ve NSOperationQueues kullanırken önemsiz miktarda ek yük var. Bunlar Kakao nesneleridir ve tahsis edilmeleri ve yeniden yerleştirilmeleri gerekir. 60 FPS'de 3 boyutlu bir sahne oluşturan yazdığım bir iOS uygulamasında, oluşturulan her kareyi kapsüllemek için NSOperations kullanıyordum. Bunu profillediğimde, bu NSOperations'ın oluşturulması ve sökülmesi, çalışan uygulamadaki CPU döngülerinin önemli bir bölümünü oluşturuyordu ve işleri yavaşlatıyordu. Bunları basit bloklar ve bir GCD seri kuyruğu ile değiştirdim ve bu ek yük kayboldu ve kayda değer ölçüde daha iyi oluşturma performansı sağladı. Bu, NSOperations'ı kullanmanın yükünü fark ettiğim tek yer değildi ve bunu hem Mac hem de iOS'ta gördüm.
İkincisi, NSOperations kullanırken eşleşmesi zor olan blok tabanlı gönderim kodunun şıklığı var. Bir bloğa birkaç satır kod sarmak ve seri veya eşzamanlı bir kuyrukta gerçekleştirilmek üzere göndermek son derece kullanışlıdır, burada bunu yapmak için özel bir NSOperation veya NSInvocationOperation oluşturmanın çok daha fazla destekleyici kod gerektirmesi gerekir. Bir NSBlockOperation kullanabileceğinizi biliyorum, ancak GCD'ye bir şey gönderiyor olabilirsiniz. Bu kodu, uygulamanızdaki ilgili işlemlerle birlikte bloklar halinde sarmak, bence bu görevleri kapsayan ayrı yöntemlere veya özel NSOperations'a sahip olmaktan daha iyi kod organizasyonuna yol açar.
NSOperations ve NSOperationQueues hala çok iyi kullanımlara sahiptir. GCD'nin NSOperationQueues'ın oldukça karmaşık bağımlılık grafikleri ayarlayabileceği gerçek bir bağımlılık kavramı yoktur. Birkaç durumda NSOperationQueues kullanıyorum.
Genel olarak, genellikle görevi yerine getiren en yüksek soyutlama düzeyini kullanmayı savunurken, bu, GCD'nin alt düzey API'sı için tartıştığım bir durumdur. Bu konu hakkında konuştuğum iOS ve Mac geliştiricileri arasında, çoğunluğu desteksiz işletim sistemi sürümlerini (iOS 4.0 ve Snow Leopard öncesi olanlar) hedeflemedikçe NSOperations üzerinden GCD kullanmayı tercih ediyor.