Queue 안에서의 Priority. (get, set)
enum NSOperationQueuePriority : Int {
case VeryLow
case Low
case Normal
case High
case VeryHigh
}
여러가지 operation의 프로퍼티가 있는데, 이를 단독으로 사용하는경우는 효용이 많지는 않기 때문에 OperationQueue와 함께 사용해서 queue를 제어하는것이 operation을 직접 제어하는것 보다 권장된다. 또한, 위를 UIKit과 연관해서 사용하기에는 MainThread에서 수행되는 보장이 없으므로 UI를 그릴때 사용하는것은 권장되지 않는다.
OperationQueue는 병렬 dispatch queue와 동등하고 NSOperationQueue 클래스로 구현된다. 실행할 작업을 정하고 operation queue에 추가하기만 하면 시스템이 스레드를 관리해준다.
GCD는 항상 FIFO로 작업 실행하지만 operation queue는 작업 실행 순서 결정할때 다른 요소들도 고려한다. 고려하는 요소 중 가장 중요한 것은 수행되려는 작업이 다른 작업의 완료에 연관이 있는지 종속성을 고려하는 것이다.
작업에 필요한 데이터를 캡슐화한 작업 객체는 Key-Value Observing(KVO) 알림을 생성하여 작업 진행 상황을 모니터링할 수 있다. Operation queue는 항상 작업을 동시에 실행하지만 종속성을 사용할 땐 순서에 맞게 실행할 수도 있다.
GCD는 스레드 관리 코드를 시스템이 하게끔 하여 개발자는 실행할 작업을 정의하고 dispatch queue에 넣기만 하면 되도록 한다. 즉 멀티쓰레딩을 위해 Apple에서 개발한 기술로 스레드 관리와 실행에 대한 책임을 애플리케이션 레벨에서 운영체제 레벨로 넘겼다.
Dispatch queue는 작업 동시에 순차적으로 실행하며 FIFO 방식으로 실행한다. Dispatch queue는 serial 방식과 Concurrent방식이 있다. 작업 단위는 Block, 스위프트에선 Closure라 불리며 DispatchQueue가 이 Block을 관리한다.
GCD는 각 애플리케이션에서 생성된 DispatchQueue를 읽는 멀티코어 실행 엔진을 가지고 있으며 이것이 Queue에 등록된 각 작업을 꺼내 쓰레드에 할당하고 개발자는 내부 동작을 자세히 알 필요 없이 Queue에 작업을 넘기기만 하면 되서쓰레드를 직접 생성하고 관리하는 것에 비해 관리 용이성과 이식성, 성능이 증가하게 되었다.
[Swift] Operation(NSOperation)이란?
[iOS] Operation과 OperationQueue (NSOperation, NSOperationQueue)
[iOS] Operation과 GCD
공식문서 - NSOperationQueue
공식문서 - NSOperation