[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🍎 Apple/Concurrency & GCD

[Swift] Operation Queue

inu 2022. 5. 27. 20:54
반응형

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