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