CGD를 객체 지향적으로 재탄생시킨 high-level의 API
GCD에서 Task라고 불렀던 코드블록을 캡슐화, 객체화(타입화) 한 것
동시성 프로그래밍과 관련된 작업들이 Operation 객체
로서 만들어지게 됨
Operation 객체
: 수행할 작업이 캡슐화된 객체
이런 객체 들은 각각 실행시킬 수도 있고, GCD처럼 OperationQueue
에 넣어서 실행 및 관리를 해줄 수 있음
let order1 = BlockOperation {
print("1번 작업중")
}
let order2 = BlockOperation {
print("2번 작업중")
}
let order3 = BlockOperation {
print("3번 작업중")
}
let operationQueue = OperationQueue()
operationQueue.maxConcurrentOperation = 2 // 동시에 2개의 작업 가능
operationQueue.addOperation(order1)
operationQueue.addOperation(order2)
operationQueue.addOperation(order3)
실행할 코드 블럭을 객체화하는DispatchWorkItem
과 비슷하지 않나? 🤔
DispatchWorkItem
보다 Operation이 먼저 나왔다는 사실!
그리고 OperationQueue의 기능에 있어서도 차이가 있다.
Operation
은 추상 클래스로 이를 상속받는 타입을 사용해야 합니다. 커스텀 클래스를 하위 클래스로 만들어주는 방법이 있고, BlockOperation
라는 하위 클래스를 사용하는 방법이 있습니다.
let operation = BlockOperation {
// 작업 코드
}
operation.addExecutionBlock = {
// operation이 실행된 후 실행될 코드
}
operation.completionBlock = {
// ExecutionBlock이 실행된 후 실행될 코드
}
operation.start()
let operationQueue = OperationQueue()
operationQueue.addOperation(operation)
OperationQueue
에 넣어주기만 하면 바로 실행됨Start
가 호출된 이후var isCancelled: Bool
var isExecuting: Bool
var isFinished: Bool
var isConcurrent: Bool
var isAsynchronous: Bool
var isReady: Bool
var name: String?
DispatchWorkItem
에 isCancelled
는 존재)start()
로 실행한 경우isAsynchronous
와 상관없이 새로운 스레드를 만들어 작업isCancelled
를 true
로 변경해줌isCancelled
를 추적해서 작업을 관리하면 됨operation1.addDependency(operation2)
operation2
의 실행이 끝나야 operation1
이 실행될 수 있음removeDependency(_:)
로 삭제도 가능let queue = OperationQueue()
let mainQueue = OperationQueue.main
let currentQueue = OperationQueue.current
cancel
메서드를 실행wait()
과 비슷참고 링크
야곰닷넷 - Operation