TIL
🌱 난 오늘 무엇을 공부했을까?
📌 야곰닷넷 - Concurrency Programming Operation
- Operation은 GCD를 객체 지향적으로 재탄생시킨 것
- Operation 객체들은 각각을 직접 실행시킬 수도 있지만 GCD처럼 OperationQueue라는 Queue에 넣어서 실행 및 관리
- Operation과 OperationQueue에서는 객체지향적으로 설계를 했기 때문에 좀 더 세부적인 스케쥴링이 가능
📍 Operation 만들기
class BlockOperation : Operation
- Operation의 하위 클래스인 BlockOperation을 활용하여 이렇게 Operation을 만들어줄 수 있다.
🔗 BlockOperation 예시
let operation = BlockOperation {
}
operation.addExecutionBlock {
}
operation.completionBlock = {
}
🔗 Operation 실행하기
operation.start()
let operationQueue = OperationQueue()
operationQueue.addOperation(operation)
🔗 Operation의 프로퍼티(읽기 전용)
var isCancelled: Bool
var isExecuting: Bool
var isFinished: Bool
var isConcurrent: Bool
var isAsynchronous: Bool
var isReady: Bool
var name: String?
🔗 Operation의 상태 변화
- isReady: Operation이 실행할 준비를 마치면 isReady 상태가 됩니다.
- isExecuting: Start가 호출된 후(혹은 OperationQueue에 의해 실행된 후) isExecuting 상태가 됩니다.
- isCancelled: Operation을 cancel하게 되면 isCancelled 상태가 됩니다.
- isFinished: cancel하지 않고 동작을 모두 마쳤다면 isFinished 상태가 됩니다.
🔗 Dependency
- Operation 인스턴스들 사이에 종속적인 관계를 만들어서 실행의 순서를 관리
- 기본적으로 Operation은 직접 실행한다면 실행한 순서대로, OperationQueue에 넣는다면 넣은 순서대로 작업을 처리한다.
addDependency(_:) 메서드로 종속적인 관계를 만들어주면 해당 Operation은 자신이 종속된 Operation의 작업이 끝날 때까지 실행할 수 없다
- removeDependency(_:) 메서드로 제거
🔗 waitUntilFinished()
- Operation이 동작하고 있는 스레드에서 해당 Operation이 끝날 때까지 기다리는 메서드.
🔗 OperationQueue
- Operation같은 경우는 좀 더 객체지향적으로 설계되어 sync/async에 대한 정보는 Operation이 가지고 있으며, 스레드 관리는 OperationQueue가 하는 식으로 역할이 분리
- OperationQueue에서는 모든 Operation에 대해 새로운 스레드를 만들어서 작업을 처리
📍 OperationQueue 사용하기
class var main: OperationQueue
class var current: OperationQueue?
- current는 현재 작업을 시작한 OperationQueue를 반환, 대기열을 확인할 수 없는 경우에는 nil이 될 수 있기 때문에 옵셔널 타입으로 정의.
- main은 메인 스레드에서 동작하는 OperationQueue를 반환합니다. 메인 스레드에서 작업해야할 때 사용하는 프로퍼티.
let queue = OperationQueue()
let mainQueue = OperationQueue.main
let currentQueue = OperationQueue.current
func addOperation(_ op: Operation)
func addOperations(_ ops: [Operation], waitUntilFinished wait: Bool)
func addOperation(_ block: @escaping () -> Void)
- addOperation은 OperationQueue에 Operation을 추가하는 메서드.
- 추가되는 동시에 Operation의 작업이 수행.
🔗 maxConcurrentOperationCount
var maxConcurrentOperationCount: Int
- 한 번에 최대로 수행되는 작업의 갯수입니다.
- maxConcurrentOperationCount를 설정해주면 작업 순서에 맞게 동시에 작업될 수 있는 Operation의 수를 제한해줄 수 있다.
🔗 cancelAllOperations()
- 대기열에 있는 모든 Operation의 cancel() 메서드를 호출
🔗 waitUntilAllOperationsAreFinished()
- 현재 스레드를 차단하고 OperationQueue의 모든 Operation 실행이 끝날 때까지 기다리는 메서드.
- DispatchGroup의 wait()와 비슷함
🔗 isSuspended
var isSuspended: Bool { get set }
- isSuspended는 대기열이 Operation 스케줄링이 진행 중인지에 대한 상태를 나타내는 Bool 값
- false인 경우, 대기열의 Operation을 실행시키고, true인 경우, 대기열의 Operation을 실행하지는 않지만 현재 실행 중인 Operation은 계속 실행
참고