야곰닷넷 - Concurrency Programming Operation

Groot·2022년 8월 24일
0

TIL

목록 보기
35/148
post-thumbnail

TIL

🌱 난 오늘 무엇을 공부했을까?

📌 야곰닷넷 - Concurrency Programming Operation

  • Operation은 GCD를 객체 지향적으로 재탄생시킨 것
  • Operation 객체들은 각각을 직접 실행시킬 수도 있지만 GCD처럼 OperationQueue라는 Queue에 넣어서 실행 및 관리
  • Operation과 OperationQueue에서는 객체지향적으로 설계를 했기 때문에 좀 더 세부적인 스케쥴링이 가능

📍 Operation 만들기

class BlockOperation : Operation

  • Operation의 하위 클래스인 BlockOperation을 활용하여 이렇게 Operation을 만들어줄 수 있다.

🔗 BlockOperation 예시

let operation = BlockOperation {
    // some code
}

// BlockOperation의 메서드
operation.addExecutionBlock {
    // some code to be executed after the operation operation.
}

// Operation의 프로퍼티
operation.completionBlock = {
    // some code to be executed after the operation and executionBlocks
}

🔗 Operation 실행하기

// 직접 실행하기
operation.start()

// OperationQueue로 실행하기
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 사용하기

  • main, current
class var main: OperationQueue
class var current: OperationQueue?
  • current는 현재 작업을 시작한 OperationQueue를 반환, 대기열을 확인할 수 없는 경우에는 nil이 될 수 있기 때문에 옵셔널 타입으로 정의.
  • main은 메인 스레드에서 동작하는 OperationQueue를 반환합니다. 메인 스레드에서 작업해야할 때 사용하는 프로퍼티.
let queue = OperationQueue()
let mainQueue = OperationQueue.main
let currentQueue = OperationQueue.current
  • addOperation
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은 계속 실행
    참고
profile
I Am Groot

0개의 댓글