반응형
Operation Queue
- Swift에서 Concurrency Programming을 구현할 때 사용하는 API 중 하나로, 주로 작업 사이에 의존성을 부여하거나 취소 기능을 구현할 때 사용합니다.
Operation
- 하나의 작업을 나타내는 객체로, 보통 Operation class를 상속한 BlockOperation class를 사용하거나 직접 Operation class를 상속받고 Custom Operation을 구현하여 사용합니다.
- Operation은 서로에게 의존성을 부여할 수 있습니다.
- 또한 취소가 가능합니다.
- Completion Handler를 적용할 수 있습니다.
- Single-shot Object (실행이 완료된 인스턴스는 재실행이 불가능)
- Ready - Executing - Finished / Cancelled 의 상태를 가집니다.
let op = BlockOperation {
...
}
op.addExecutionBlock {
...
}
op.comletionBlock = {
...
}
- 기본적인 BlockOperation 객체를 생성합니다.
- addExecutionBlock 메서드를 통해 작업(Block)을 추가할수도 있습니다.
- comletionBlock 속성에 작업이 종료된 후에 수행할 작업을 정의할 수도 있습니다.
Operation Queue
- Operation들을 Queue로 관리합니다.
- 어떤 Operation을 먼저 실행할지는 우선순위 및 의존성에 따라 결정됩니다.
- 내부적으로 사용가능한 리소스를 계산하여 동시에 실행할 수 있는 작업은 동시에 실행하며 최대한 빨리 처리합니다.
let queue = OperationQueue()
queue.addOperation(op)
queue.cancelAllOperations()
- addOperation 메서드를 통해 operation을 추가할 수 있습니다.
- cancelAllOperations 메서드를 통해 모든 operation을 cancel할 수 있습니다.
- 다만 이렇게한다고 수행중인 operation이 중지되는 것은 아닙니다.
- 단지 operation 내부의 isCancelled 옵션이 true로 변경될 뿐입니다.
- 따라서 해당 옵션을 확인해 작업을 중지하도록 구현된 경우에만 실질적 작업이 중지됩니다. (ex. if isCacnelled { return })
- 이런식으로 작업이 취소된 경우 완료된 것으로 간주되어 completionBlock이 존재한다면 실행됩니다.
Operation Priority
Operation Priority는 Operation들의 우선순위를 결정합니다.
- Operation Priority는 총 5가지가 존재합니다.
- veryHigh
- high
- normal (default)
- low
- varyLow
- 더 높은 우선순위의 Operation이 우선적으로 처리됩니다.
Quality of Service
- 리소스를 사용할 우선순위를 결정합니다.
- 우선순위가 높을 수록 리소스(CPU, 메모리, 네트워크 등)을 더 오래 사용할 수 있습니다.
- Quality of Service는 총 4가지가 존재합니다.
- userInteractive
- userInitiated
- utility
- background (default)
Interoperation Dependencies
- Operation Queue에서는 Operation끼리의 의존성을 추가해 실행 순서를 결정할 수 있습니다.
- addDependency(_:) 메서드, removeDependency(_:) 메서드, dependencies 속성을 통해 관련 작업을 수행할 수 있습니다.
- addDependency 메서드로 특정 Operation에 다른 Operation이 추가할 수 있습니다. 이 경우 추가된 다른 Operation이 완료되어야 해당 Operation 작업이 수행됩니다.
- removeDependency 메서드로 특정 Operation 의존성을 제거할 수 있습니다.
- dependencies 속성을 통해 현재 Operation이 의존하고 있는 Operation의 목록을 확인할 수 있습니다.
반응형
'🍎 Apple > Concurrency & GCD' 카테고리의 다른 글
[Concurrency] async / await (2) | 2023.03.31 |
---|---|
[Swift] GCD 정리하기 (2) | 2022.05.30 |
[Swift] Actor (4) | 2022.03.08 |
[Swift][문서의역] Task (0) | 2022.03.08 |
[Swift][문서의역] Concurrency (async & await) (0) | 2022.03.08 |