import UIKit
let mainQueue = OperationQueue.main
// In the main queue, you should update your UI
mainQueue.addOperation
→ addOperation 다음에 실행할 수 있는 종류의 코드가 많음.
ex.
mainQueue.addOperation(_ op: Operation)
// Operation 을 pass 하는 것임
let operation = Operation()
mainQueue.addOperation(operation)
// 이런 식으로 main queue 에 작업을 추가할 수 있음
예시:
let customQueue = OperationQueue()
let fetchIDOperation = Operation()
let fetchPhotoWithIDOperation = Operation()
fetchPhotoWithIDOperation.addDependency(fetchIDOperation)
customQueue.addOperation(fetchPhotoWithIDOperation)
// 큐에 fetchPhotoWithIDOperation 을 넣어도 큐는 이 작업이 fetchIDOperation 에
// dependent 하다는 것을 안다.
→ 핵심은 먼저 유저 아이디를 가져와야 한다는 것이다. addDependency(fetchIDOperation) 의 의미는 곧 Operation Queue 보고 fetchIDOperation 이 완료되기 전에 fetchPhotoWithIDOperation 를 실행시키지 말라는 것이다.
→ 이러한 Dependency 를 추가할 수 있기 때문에 DispatchQueue / Grand Central Dispatch (GCD) 보다 OperationQueue 를 더 선호할 때가 많음
( DispatchQueue 에서도 dependency 추가는 가능하다 사용 자체는 OperationQueue가 더 쉬움 )
States
예시:
fetchPhotoWithIDOperation.cancel()
Queue Customizing
let customQueue = OperationQueue()
customQueue.maxConcurrentOperationCount = 30
→ 만약 customQueue 에 40개의 작업을 추가했다면, 30개의 작업만 동시적으로 (concurrently) 실행이 되며, 나머지 10개는 Queue 에 넣어 미리 추가된 30개의 작업이 하나씩 수행 완료될 때마다 실행이 됨.
참고:
왜 ? → 대부분의 로직은 OperationQueue 를 사용할만큼 복잡한 dependency 를 가지고 있지 않다.
→ Operation Queue 는 사실 GCD / Dispatch Queue에 구현이 되어있음