29

애플의 그랜드 센트럴 디스패치 참조는 말한다 :고급 애플리케이션의 경우 NSOperation 및 블록에서 GCD를 선택해야하는 이유는 무엇입니까?

"... 당신의 응용 프로그램은 파일 디스크립터를, 마하 포트, 신호 조작 할 필요가있는 경우는 시스템 - 예를 들어의 유닉스 수준에서 작동 할 필요가있는 경우 GCD는 시스템 수준의 응용 프로그램에만 국한되지 않지만 상위 응용 프로그램에 사용하기 전에 은 코코아에서 제공되는 유사한 기능 ( NSOperation 및 블록 객체 사용)을 사용하기가 더 쉬운지 또는 귀하의 필요에 맞게 을 추가하십시오. ".

http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

실제로 상황을 생각할 수 없다

, 높은 수준의 응용 프로그램에 대한,있는 GCD의 사용은 필수이며 NSOperation은/사용할 수 없습니다 수 있습니다.

의견이 있으십니까?

+0

https : // cocoacasts.com/choose-between-nsoperation-and-grand-central-dispatch/ – Masih

답변

50

여기에서 만들어지는 점은 크리스 핸슨은 그의 기사 "When to use NSOperation vs. GCD"에 명시 동일 하나입니다

는 항상을 사용

똑 바른 대답은 모든 응용 프로그램 개발을위한 일반 지침입니다 사용할 수있는 가장 높은 수준의 추상화이며 측정에 이 필요하다고 표시되면 을 낮은 수준의 추상화로 내립니다.

이 특별한 경우에는 코코아 애플리케이션을 작성할 때 일반적으로 GCD를 사용하여 이 아닌 NSOperation을 사용해야 함을 의미합니다. 효율성의 차이 때문이 아니라 입니다. NSOperation은 GCD의 메커니즘의 상위 레벨 추상화를 제공하기 때문에.

일반적으로 이에 동의합니다.NSOperation과 NSOperationQueue는 GCD 블록과 큐가 가지고 있지 않은 의존성과 하나 또는 두 가지 다른 것들을 지원하며, 동시 연산이 어떻게 구현되는지에 대한 하위 레벨의 세부 사항을 추상화합니다. 이 기능이 필요하다면 NSOperation은 매우 좋은 방법입니다.

그러나 둘 다 작업 한 후에는 NSOperation 기반 코드를 모두 GCD 블록 및 대기열로 교체하는 것으로 나타났습니다. 나는 두 가지 이유로 이것을 해냈다 : 빈번한 동작을 위해 NSOperation을 사용할 때 상당한 오버 헤드가 있었고, GCD 블록을 사용할 때 내 코드가 더 깨끗하고 더 잘 묘사된다고 생각한다.

첫 번째 이유는 OpenGL ES 프레임을 화면에 렌더링하는 것과 같이 작고 빈번한 작업을 처리 할 때 NSOperation 개체 할당 및 할당 취소 프로세스가 상당한 양의 CPU 리소스를 사용한다는 것을 발견 한 내 응용 프로그램의 프로파일 링 때문입니다. GCD 블록은 오버 헤드를 완전히 제거하여 성능을 크게 향상 시켰습니다.

두 번째 이유는 주관적이지만 NSOperations보다 블록을 사용할 때 코드가 더 깨끗하다고 ​​믿습니다. 블록에 허용 된 범위의 빠른 캡처와 그 인라인 특성으로 인해 코드 작성이 줄어들며, 사용자 정의 NSOperation 서브 클래스를 만들거나 조작에 전달할 매개 변수를 번들로 묶을 필요가 없으며, 왜냐하면 코드가 실행되는 지점에서 실행되도록 코드를 배치 할 수 있기 때문입니다.

다시 한번 말하지만, 나는 더 추상적 인 코코아 애플리케이션에서도 GCD를 더 많이 사용하고 있음을 발견했습니다.

+0

NSOperationQueue는 이제 클로저를 사용할 수 있습니다. 이 답변을 (약간) 업데이트해야합니까? 또한, 지난 5 년간 NSOperation이 오버 헤드를 줄이기 위해 최적화되었을 가능성이 있습니까? –

+0

나는 GCD를 직접 사용하여 수년간 NSOperationQueue로 전환 한 후 신선한 공기를 마시 게되었다. 내 '큐잉'동작은 현재 잘 정의되어 있으며 최대 동시 작업을 완벽하게 제어 할 수 있습니다. 실행중인 작업을 취소하고 새 작업으로 바꾸는 것도 더 쉽습니다. 결과는 잘 정의 된 동작입니다. 나는 여전히 간단한 비동기 작업을 위해 GCD를 사용하지만 직렬/비동기식 대기열 처리를 위해 NSOperationQueue로 전환했습니다. – strangetimes

+0

좋은 설명을 위해 Upvoted. – user3182143

4

음, NSOperation에는 dispatch_source_t, dispatch_io, dispatch_data_t, dispatch_semaphore_t 등등과 같은 요소가 없습니다. 또한 다소 높은 오버 헤드입니다.

libdispatch에는 작업 종속성, 작업 우선 순위 (대기열 우선 순위가 다소 다름) 또는 작업에서의 KVO와 동일한 기능이 없습니다.

+1

'NSOperation'은 이제'GCD'의 맨 위에 구축되었으므로, 당신이 필요로하는 것이없는 한 거기에는 다른 것이 없습니다. 그것은 다른 것에 비해 훨씬 많은 것을 의미합니다. – hypercrypt

+1

여전히 복잡한 작업 중에서도 작업에 객체 할당이 필요합니다. 실제로 의미있는 오버 헤드가 될 수있는 극히 세분화 된 스레딩의 경우. 예, 저는 이것을 측정했습니다. 네, 제 코드 중 일부는 매우 중요합니다. NSOperation의 GCD 래핑은 종속성, KVO 및 우선 순위를 지원해야하기 때문에 예상 할 수있는 간단한 매핑이 아닙니다. –

+0

맞습니다. NSDperation을 GCD 블록에서 볼 수없는 자주 발생하는 작업에 사용하는 데 상당한 오버 헤드가 발생했습니다. 이러한 경우 개체 할당/할당 해제가 매우 비쌀 수 있으므로 GCD가 더 적합 할 수 있습니다. –

0

저는 실제로 이것에 대해 읽었으며 놀라움을 알게 될 것이라고 확신합니다. 의견이 다릅니다.

NSOperation에서 GCD를 사용해야하는 경우는 생각할 수 없지만 그런 경우는 존재하지 않습니다. 그러나 나는 베스트 프랙티스 코딩에 관한 일반 감정에 동의한다.

작업에 적합한 몇 가지 툴 (이 경우 NSOperation 대 ​​GCD 블록을 가짐)이있는 경우, 가장 높은 추상화 수준 (즉, 최상위 API)을 가진 클래스입니다. 일반적으로 코드를 사용하는 것이 더 쉽고 코드가 적을뿐 아니라 상위 레벨 API에 도입 될 잠재적 인 향후 개선 사항을 얻을 수 있습니다.

13
  • 작업이 그리 복잡하지 않고 최적 CPU 성능이 인 GCD를 선호하십시오.
  • 작업이 복잡하고 블록 및 종속성 관리를 취소 또는 일시 중단하는 이 필요한 NSOperationQueue를 사용하십시오..

GCD는 동시에 실행될 작업 단위를 나타내는 간단한 방법입니다. 이 작업 단위를 스케줄하지 마십시오. 시스템이 일정을 관리합니다. 블록간에 종속성을 추가하는 것은 골칫거리가 될 수 있습니다. 블록을 취소하거나 일시 중단하면 개발자로서 추가 작업이 생성됩니다!

NSOperation 및 NSOperationQueue는 GCD에 비해 약간의 오버 헤드를 추가하지만 다양한 작업간에 종속성을 추가 할 수 있습니다. 작업을 재사용, 취소 또는 일시 중단 할 수 있습니다. NSOperation은 KVO (Key-Value Observation)와 호환됩니다. 예를 들어 NSNotification을 듣고 NSOperation을 시작할 수 있습니다. 자세한 설명

이 질문 참조 : NSOperation vs Grand Central Dispatch

1

이 NSOperationQueue는 GCD이하지 않는 것을 할 수있는 두 가지가 있습니다를 : 마이너 하나의 종속성입니다 (큐에 작업을 추가 만 실행하도록 지시 어떤 다른 작업이 끝나면), NSOperation은 매우 제한된 경우를 제외하고는 메시지를받을 수없는 블록이있는 GCD와는 달리 작업이 실행되는 동안 메시지를받을 수있는 객체를 제공합니다. 이 두 가지 기능이 필요하거나 그렇지 않습니다. 그렇지 않으면 GCD를 사용하는 것이 훨씬 쉽습니다.

NSOperation의 유용한 예는 항상 매우 복잡합니다. 그들이 쉽다면 GCD를 대신 사용할 것입니다. 일반적으로 NSOperation의 서브 클래스를 만들면 상당한 양의 작업이되거나 다른 누군가가 만든 작업을 사용할 수 있습니다.

관련 문제