https://developer.apple.com/documentation/foundation/operationqueue
A queue that regulates the execution of operations.
오퍼레이션 수행을 규제하는 큐입니다.
class OperationQueue : NSObject
오퍼레이션 큐는 오퍼레이션의 우선순위와 준비 상태에 기반해 큐에 있는 Operation
을 호출합니다. 오퍼레이션을 큐에 추가한 후 오퍼레이션은 작업을 마치기 전까지 큐에 남게 됩니다. 큐에 오퍼레이션을 추가한 후 큐로부터 오퍼레이션을 직접 제거할 수 없습니다.
Note
오퍼레이션 큐는 오퍼레이션이 완료될 때까지 오퍼레이션을 유지하고, 큐는 자체로 모든 오퍼레이션이 완료될 때까지 유지됩니다. 완료되지 않은 오퍼레이션과 함께 오퍼레이션 큐를 일시정지하는 것은 메모리 누수를 초래할 수 있습니다.
오퍼레이션 큐의 사용과 관련한 더 많은 정보는 Concurrency Programming Guide를 보시기 바랍니다.
Concurrency Programming Guide
https://developer.apple.com/library/archive/documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008091
오퍼레이션 큐는 각 오퍼레이션의 준비 상태, 우선순위 수준, 오퍼레이션 종속성에 따라 오퍼레이션을 조직화하고 호출합니다. 큐에 있는 모든 오퍼레이션이 같은 queuePriority
속성과 isReady
속성이 true
라면 큐는 추가된 순서에 따라 오퍼레이션을 호출합니다. 그렇지 않다면 오퍼레이션 큐는 항상 가장 높은 우선순위의 오퍼레이션부터 호출합니다.
그러나 오퍼레이션의 준비 상태 변경이 수행 순서를 변경할 수 있기 때문에 오퍼레이션 순서 수행을 보장과 관련해 큐 시맨틱에 의존하지 않아야 합니다. 오퍼레이션 의존성은 오퍼레이션에 대해 절대적인 수행 순서를 제공하며, 여러 오퍼레이션이 다른 오퍼레이션 큐에 있다고 하더라도 마찬가지입니다. 오퍼레이션 객체는 모든 종속 오퍼레이션이 실행을 마칠 때까지 준비 상태가 아닙니다.
우선 순위 설정 및 의존성을 설정하는 방법은 Managing Dependencies in Operation을 보시기 바랍니다.
Managing Dependencies in Operation
https://developer.apple.com/documentation/foundation/operation#1661485
작업을 완료하는 것이 오퍼레이션이 해당 작업을 완료했다는 의미는 아닙니다. 오퍼레이션 역시 취소될 수 있습니다. 오퍼레이션 객체를 취소시키는 것은 큐에 객체를 남기지만, 가능한 빠르게 작업을 멈춰야 한다는 것을 객체에 알려야 합니다. 현재 수행중인 오퍼레이션에서 오퍼레이션 객체의 작동 코드는 취소 상태, 하고 있는 것의 중지를 의미하고, 완료된 것으로 표시되는 것을 의미합니다. 아직 수행되지 않았지만 큐에 있는 오퍼레이션에 대해서 큐는 취소 이벤트를 처리할 수 있도록 오퍼레이션 객체의 start()
메소드를 호출할 수 있는 상태가 되어야 하며, 수행을 마친 상태로 표시될 수 있어야 합니다.
Note
오퍼레이션을 취소하는 것은 오퍼레이션이 모든 의존성을 무시하도록 합니다. 이 동작은 큐가 오퍼레이션의start()
메소드를 가능한 빠르게 호출할 수 있도록 해줍니다.start()
메소드는 큐에서 제거될 수 있도록 오퍼레이션을 완료된 상태로 이동시킵니다. 오퍼레이션 취소에 대한 더 많은 정보는 Responding to the Cancel Command in Operation을 보시기 바랍니다.
Responding to the Cancel Command in Operation
https://developer.apple.com/documentation/foundation/operation#1661262
OperationQueue
는 키 값 코 딩, 키 값 옵저빙을 준수합니다. 애플리케이션의 다른 부분을 제어하기 위해 이 속성들을 관찰할 수 있습니다. 속성들을 관찰하려면 아래 키 경로를 사용해야 합니다.
operations
— Read-onlyoperationCount
— Read-onlymaxConcurrentOperationCount
— Readable and writableisSuspended
— Readable and writablename
— Readable and writable이 속성들에 옵저버를 붙일 수 있지만 애플리케이션 UI의 요소에 이 속성들을 바인드하고자 코코아 바인딩을 사용하지 않아야 합니다. UI와 관련이 있는 코드는 일반적으로 오직 앱의 메인 스레드만 실행합니다. 그러나 오퍼레이션 큐와 관련이 있는 KVO 노티피케이션은 모든 스레드에서 발생할 수 있습니다.
KVO 및 객체에 옵저버를 붙이는 방법은 Key-Value Observing Programming Guide를 보시기 바랍니다.
Key-Value Observing Programming Guide
https://developer.apple.com/library/archive/documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008091
단일 OperationQueue
객체를 해당 객체에 동기화 접근을 위한 추가적인 락 생성 없이 다중 스레드로부터 안전하도록 사용할 수 있습니다.
오퍼레이션 큐는 오퍼레이션의 수행 초기화에 디스패치 프레임워크를 사용합니다. 결과적으로 큐는 항상 분리된 스레드에서 오퍼레이션을 호출하며, 오퍼레이션이 동기 방식인지 비동기 방식인지는 관련이 없습니다.