[ios] NSOperation 및 그랜드 센트럴 디스패치

iOS의 동시 프로그래밍에 대해 배우고 있습니다. 지금까지 NSOperation/NSOperationQueue 및 에 대해 읽었습니다 GCD. 이상 을 사용하는 이유는 무엇입니까 ?NSOperationQueueGCD

모두 같은 소리 GCDNSOperationQueue멀리 추상적의 명시적인 생성 NSThreads사용자로부터. 그러나 두 가지 접근 방식의 관계가 명확하지 않으므로 의견을 보내주십시오!



답변

GCD작업 기반 동시성 모델을 매우 간단하게 사용할 수있는 저수준 C 기반 API입니다. NSOperation그리고 NSOperationQueue비슷한 일을하는 Objective-C 클래스입니다. NSOperation가 처음 소개되었지만 10.5iOS 2 기준 으로 NSOperationQueue친구는 내부적으로를 사용하여 구현되었습니다 GCD.

일반적으로 요구에 맞는 최고 수준의 추상화를 사용해야합니다. 즉 , 지원하지 않는 작업을 수행해야하는 경우가 아니라면 일반적으로 NSOperationQueue대신 대신 사용해야 합니다 .GCDNSOperationQueue

참고 NSOperationQueue아닌 “무식 다운”GCD의 버전; 사실, NSOperationQueue순수하게 많은 작업을 수행하는 것만으로도 간단하게 할 수있는 일이 많이 있습니다 GCD. (예 :. 한 번에 N 작업을 실행 대역폭이 제한된 큐, 작업 간의 종속성을 설정하는 두 매우 간단한 NSOperation와 매우 어렵다 GCD.) 애플이 가진 아주 좋은 객체 친화적 인 API를 만들 GCD를 활용의 노력을 다 NSOperation. 당신이하지 않는 이유가없는 한 그들의 작업을 활용하십시오.

주의 사항 : 반면에, 실제로 블록을 보내야하고 NSOperationQueue제공 하는 추가 기능이 필요하지 않은 경우 GCD 사용에 아무런 문제가 없습니다. 작업에 적합한 도구인지 확인하십시오.


답변

와 라인에서 관련 질문에 대한 내 대답은 , 나는 후자는 GCD하지 않는 것을해야 할 일을 제공하지 않는 한, BJ에 동의하고 당신에게 NSOperation / NSOperationQueue 이상 GCD 처음 모습을 제안하겠습니다.

GCD 이전에는 동시성 관리를 위해 응용 프로그램 내에서 많은 NSOperations / NSOperationQueues를 사용했습니다. 그러나 정기적으로 GCD를 사용하기 시작한 이래로 NSOperations와 NSOperationQueues를 블록 및 디스패치 큐로 거의 완전히 대체했습니다. 이것은 실제로 두 기술을 실제로 사용한 방법과 내가 수행 한 프로파일 링에서 비롯된 것입니다.

첫째, NSOperations 및 NSOperationQueues를 사용할 때 사소한 양의 오버 헤드가 있습니다. 이들은 Cocoa 객체이며 할당 및 할당 해제가 필요합니다. 필자가 작성한 60 FPS에서 3D 장면을 렌더링하는 iOS 응용 프로그램에서 NSOperations를 사용하여 렌더링 된 각 프레임을 캡슐화했습니다. 필자가이 프로파일을 작성할 때 이러한 NSOperation의 생성 및 해제는 실행중인 응용 프로그램의 CPU주기 중 상당 부분을 차지했으며 속도가 느려졌습니다. 나는 이것을 간단한 블록과 GCD 시리얼 큐로 교체했고, 오버 헤드가 사라져서 렌더링 성능이 눈에 띄게 향상되었습니다. NSOperations 사용으로 인한 오버 헤드를 발견 한 유일한 곳은 아니 었으며 Mac과 iOS 모두에서이 기능을 보았습니다.

둘째, NSOperations를 사용할 때 일치하기 어려운 블록 기반 디스패치 코드의 우아함이 있습니다. 블록에 몇 줄의 코드를 래핑하고 직렬 또는 동시 큐에서 수행되도록 디스패치하는 것이 매우 편리합니다.이 작업을 수행하려면 사용자 지정 NSOperation 또는 NSInvocationOperation을 생성하면 훨씬 더 많은 지원 코드가 필요합니다. NSBlockOperation을 사용할 수 있다는 것을 알고 있지만 GCD에 무언가를 전달할 수도 있습니다. 이 코드를 응용 프로그램의 관련 처리와 함께 인라인으로 감싸면 이러한 작업을 캡슐화하는 별도의 방법이나 사용자 지정 NSOperation보다 코드 구성이 향상됩니다.

NSOperations 및 NSOperationQueues는 여전히 매우 유용합니다. GCD는 NSOperationQueues가 매우 복잡한 종속성 그래프를 설정할 수있는 실제 종속성 개념이 없습니다. 소수의 경우 NSOperationQueues를 사용합니다.

전반적으로 필자는 일반적으로 작업을 수행하는 최고 수준의 추상화 사용을 옹호하지만 GCD의 하위 수준 API를 주장하는 경우입니다. 내가 이야기 한 iOS 및 Mac 개발자들 중 대다수는 지원하지 않는 OS 버전 (iOS 4.0 및 Snow Leopard 이전)을 대상으로하지 않는 한 NSOperations를 통해 GCD를 사용하기로 결정했습니다.


답변

GCD저수준 C 기반 API입니다.
NSOperationNSOperationQueue목표 – C 클래스입니다.
NSOperationQueue객관적인 C 래퍼 GCD입니다. NSOperation을 사용하는 경우 그랜드 센트럴 디스패치를 암시 적으로 사용 합니다.

NSOperation에 비해 GCD의 장점 :
i. 구현
에 대한 GCD구현은 매우 가벼운 무게가
NSOperationQueue복잡하고 중량이 무거운

GCD에 비해 NSOperation의 장점 :

나는. Control On Operation
은 일시 정지, 취소, 재개를 할 수 있습니다NSOperation

ii. 종속성
이 둘 사이에 종속성을 설정할 수 있습니다 NSOperations
모든 종속성이 완성에 대해 true를 반환 할 때까지 작업이 시작되지 않습니다.

iii. 작업
상태는 작업 또는 작업 큐의 상태를 모니터링 할 수 있습니다. 준비, 실행 또는 완료

iv. 최대
작업 수 동시에 실행할 수있는 최대 대기 작업 수를 지정할 수 있습니다.

시에로 이동 GCD또는NSOperation
당신이 (모든 위에서 언급 한) 사용을 큐보다 효율적으로 관리를 원하는 NSOperation
당신이 오버 헤드가 적은 원하는 간단한 경우에 (그냥 약간의 추가 작업으로 “배경으로”몇 가지 작업을 수행 할) 사용GCD

심판 :
https://cocoacasts.com/choosing-between-nsoperation-and-grand-central-dispatch/
http://iosinfopot.blogspot.in/2015/08/nsthread-vs-gcd-vs-nsoperationqueue.html
http : //nshipster.com/nsoperation/


답변

GCD보다 NSOperation을 선호하는 또 다른 이유는 NSOperation의 취소 메커니즘입니다. 예를 들어, 수십 장의 사진을 보여주는 500px와 같은 앱은 NSOperation을 사용하여 테이블보기 또는 컬렉션보기를 스크롤 할 때 보이지 않는 이미지 셀의 요청을 취소 할 수 있습니다. 이는 앱 성능을 크게 향상시키고 메모리 공간을 줄일 수 있습니다. GCD는 이것을 쉽게 지원할 수 없습니다.

또한 NSOperation을 통해 KVO가 가능합니다.

다음 은 읽을 가치가있는 Eschaton의 기사입니다.


답변

GCD는 실제로 NSOperationQueue보다 낮은 수준이며, 주요 이점은 구현이 매우 가볍고 잠금없는 알고리즘 및 성능에 중점을 둔다는 것입니다.

NSOperationQueue는 GCD에서 사용할 수없는 기능을 제공하지만 그다지 비용이 들지 않으며 NSOperationQueue의 구현은 복잡하고 무겁고 많은 잠금이 필요하며 내부적으로 최소한의 방식으로 GCD를 사용합니다.

NSOperationQueue가 제공하는 기능이 꼭 필요하다면 GCD로 충분하다면 성능을 높이고 CPU 및 전력 비용을 크게 낮추고 유연성을 높이기 위해 직접 사용하는 것이 좋습니다.


답변

NSQueueOperations와 GCD는 UI Application Main Tread를 해제하여 별도의 스레드에서 백그라운드에서 무거운 계산 작업을 실행할 수 있습니다.

이전 게시물을 기반으로 NSOperations에 addDependency가 있으므로 작업을 순차적으로 대기열에 넣을 수 있습니다.

그러나 dispatch_queue_create를 사용하여 대기열에서 작업을 실행할 수있는 GCD 직렬 대기열에 대해서도 읽었습니다. 이를 통해 일련의 작업을 순차적으로 실행할 수 있습니다.

GCD에 비해 NSQueueOperation의 장점 :

  1. 의존성을 추가하고 의존성을 제거 할 수 있으므로 하나의 트랜잭션에 대해 종속성을 사용하여 순차적으로 실행할 수 있고 다른 트랜잭션에 대해 동시에 실행할 수 있지만 GCD는이 방법으로 실행할 수 없습니다.

  2. 작업이 대기열에 있으면 작업을 취소하기 쉬우 며 실행 중이면 중지 할 수 있습니다.

  3. 최대 동시 작업 수를 정의 할 수 있습니다.

  4. 대기열에있는 작업을 일시 중단 할 수 있습니다

  5. 대기열에 보류중인 작업 수를 찾을 수 있습니다.


답변

GCD는 사용하기 매우 쉽습니다. 백그라운드에서 무언가를하고 싶다면 코드를 작성하고 백그라운드 큐에 전달하면됩니다. NSOperation과 동일한 작업을 수행하는 것은 많은 추가 작업입니다.

NSOperation의 장점은 (a) 메시지를 보낼 수있는 실제 개체가 있고 (b) NSOperation을 취소 할 수 있다는 것입니다. 그것은 사소한 것이 아닙니다. NSOperation을 서브 클래 싱해야합니다. 취소 및 작업을 올바르게 완료하려면 코드를 올바르게 작성해야합니다. 따라서 간단한 것에는 GCD를 사용하고 더 복잡한 것에는 NSOperation의 하위 클래스를 만듭니다. NSInvocationOperation 및 NSBlockOperation 서브 클래스가 있지만 GCD로 수행하는 모든 작업이 더 쉬워 지므로 사용할 이유가 없습니다.