주제: GCD vs. Operation
서론
- app concurrent를 만들 때 사용할 수 있는 두 개의 API가 있다. 이는 Grand Central Dispatch(GCD), Operations이다.
- 이 두 개는 서로 경합되는 기술이 아닐뿐더러 전혀 다른 기술이 아니다.
- Operations은 GCD를 기반으로 구현되어있다.
Grand Central Dispatch
- Grand Central Dispatch(GCD)는 C의 libdispatch 라이브러리의 Apple에서 구현한 것이다. CGD는 자원의 가용성에 따라 병렬로 실행될 수 있는 메서드나 클로저와 같은 작업을 큐잉하고, 그런 다음 이러한 작업을 가용한 프로세서 코어에 실행한다.
- GCD는 Thread를 사용하지만, Thread를 직접 관리할 필요가 없다. 전통적인 스레드를 생성하는 데에는 수백 개의 명령어가 필요한 반면, GCD는 구현에 단 15개의 명령어만 필요하다고 언급했었다(2009 wwdc)
- GCD가 관리하는 모든 작업은 GCD-FIFO 큐에 넣어진다. 큐에 제출하는 각 작업은 시스템에서 완전히 관리되는 스레드 풀에서 실행된다.
- 어떤 스레드에서 작업이 실행되는지에 대해서는 보장할 수 없다.
Operation
- Operation은 GCD에서 여러가지 기능을 더한 것이며, 복잡한 일을 담당하고 데이터와 기능을 캡슐화한 객체이다. 취소 / 순서지정 / 일시중지 등의 기능을 사용할 수 있다.
- GCD는 백그라운드에서 한 번 실행되어야 하는 일반적인 작업에 적합하다. 예를들면, 이미지 편집 작업과 같은 작업이다. 이러한 기능은 클래스에 캡슐화하는 것이 좋은데, Operatio이 이를 SubClass화 하여 위와 같은 작업을 할 수 있다.
- Operation은 클로저를 DispatchQueue에 제출하는 것과 마찬가지로 OperationQueue에 제출할 수 있는 완전한 기능을 갖춘 클래스이다. 클래스이므로 변수를 포함할 수 있어서 작업의 상태를 언제든지 파악할 수 있다.
- Operation은 다음 중 하나의 상태로 존재할 수 있다.
- isReady
- isExecuting
- isCancelled
- isFinished
- GCD와 다르게, Operation은 기본적으로 동기적으로 실행되며, 비동기적으로 실행하기 위해서는 추가 작업이 필요하다. 이는 작업을 OperationQueue에 제출하여 메인 스레드에서 떼어내는 것이다.
- GCD와 다르게 비동기 작업을 Operation으로 래핑하고 각 작업간에 종속성을 지정하는 것과 같은 일반적인 요구 사항을 더욱 세밀하게 제어할 수 있다.
- Operation을 많이 사용하는 앱에서도 단순한 GCD 스타일의 클로저가 필요한 경우가 있는데, 이는 DispatchQueue를 생성할 필요 없이 BlockOperation 클래스를 사용하면 된다.
- BlockOperation은 Operation을 서브 클래스화하고, 하나 이상의 클로저를 기본 글로벌 큐(default global queue)에서 동시에 실행된다. 그러나 실제 Operation의 서브 클래스이기 때문에 Operation의 모든 다른 가능을 활용할 수 있다.
class MyOperation: Operation {
override func main() {
if isCancelled {
return
}
}
}
let queue = OperationQueue()
let operation = MyOperation()
queue.addOperation(operation)
- 위 예시에서는 Operation을 서브 클래스로 구현한
MyOperation
클래스를 정의하고, main()
메서드에서 실제 작업을 수행한다. main()
메서드는 작업을 실행할 때 호출되는 메서드이다. 만약 작업이 이미 취소된 경우, 메서드는 그대로 종료된다.
- 그리고
OperationQueue
를 생성한 후 addOperation()
메서드를 사용하여 MyOperation
객체를 큐에 추가가한다. 큐는 작업을 실행할 스레드를 자동으로 관리한다.
- 이렇게 작성된
MyOperation
클래스는 isReady
, isExecuting
, isCancelled
, isFinished
등의 작업 상태와 관련된 프로퍼티를 제공한다. OperationQueue
에서는 이러한 프로퍼티를 사용하여 작업의 상태를 추적할 수 있다.
- 작업을 취소하려면,
Operation
클래스의 cancel()
메서드를 호출하면 된다.
출처(참고문헌)
제가 학습한 내용을 요약하여 정리한 것입니다. 내용에 오류가 있을 수 있으며, 어떠한 피드백도 감사히 받겠습니다.
감사합니다.