Zgodnie z moją odpowiedzią na powiązane pytanie zamierzam się nie zgodzić z BJ i zasugerować, aby najpierw spojrzeć na GCD przez NSOperation / NSOperationQueue, chyba że to drugie zapewnia coś, czego GCD nie potrzebuje.
Przed GCD korzystałem z wielu aplikacji NSOperations / NSOperationQueues w swoich aplikacjach do zarządzania współbieżnością. Jednak odkąd zacząłem używać GCD regularnie, prawie całkowicie zastąpiłem NSOperations i NSOperationQueues blokami i kolejkami wysyłki. Wynika to z tego, jak korzystałem z obu technologii w praktyce oraz z profilowania, które na nich przeprowadziłem.
Po pierwsze, korzystanie z NSOperations i NSOperationQueues wiąże się z nietrywialnym obciążeniem. Są to obiekty kakaowe i należy je przydzielić i zwolnić. W napisanej przeze mnie aplikacji na iOS, która renderuje trójwymiarową scenę przy 60 FPS, używałem NSOperations do enkapsulacji każdej renderowanej ramki. Kiedy profilowałem to, tworzenie i porzucanie tych NSOperations odpowiadało za znaczną część cykli procesora w uruchomionej aplikacji i spowalniało rzeczy. Zastąpiłem je prostymi blokami i kolejką szeregową GCD, a ten narzut zniknął, co prowadzi do zauważalnie lepszej wydajności renderowania. To nie było jedyne miejsce, w którym zauważyłem narzut dzięki korzystaniu z NSOperations i widziałem to zarówno na Macu, jak i iOS.
Po drugie, blokowy kod wysyłki ma elegancję, którą trudno dopasować przy użyciu NSOperations. Bardzo wygodne jest zawinięcie kilku wierszy kodu w blok i wysłanie go do wykonania w kolejce szeregowej lub współbieżnej, gdzie utworzenie niestandardowego NSOperation lub NSInvocationOperation wymaga o wiele więcej kodu pomocniczego. Wiem, że możesz użyć NSBlockOperation, ale równie dobrze możesz wtedy wysłać coś do GCD. Zawijanie tego kodu w bloki w powiązaniu z powiązanym przetwarzaniem w twojej aplikacji prowadzi moim zdaniem do lepszej organizacji kodu niż posiadanie osobnych metod lub niestandardowych NSOperations, które zawierają te zadania.
NSOperations i NSOperationQueues nadal mają bardzo dobre zastosowania. GCD nie ma prawdziwej koncepcji zależności, w której NSOperationQueues może skonfigurować dość złożone wykresy zależności. Używam do tego NSOperationQueues w kilku przypadkach.
Ogólnie rzecz biorąc, chociaż zwykle opowiadam się za wykorzystaniem najwyższego poziomu abstrakcji, który spełnia zadanie, jest to jeden przypadek, w którym opowiadam się za niższym poziomem API GCD. Spośród programistów iOS i Mac, z którymi rozmawiałem na ten temat, zdecydowana większość decyduje się na użycie GCD zamiast NSOperations, chyba że są ukierunkowane na wersje systemu operacyjnego bez obsługi tego systemu (te wcześniejsze niż iOS 4.0 i Snow Leopard).