Swift: Operation - Operation Property

Wooyo·2023년 10월 30일
0
post-thumbnail

1. operation의 프로퍼티

  • operation의 상태를 추적할 수 있는 프로퍼티가 존재
  • 모두 읽기 전용 프로퍼티
isReady: Operation이 실행할 준비를 마치면 isReady
isExecuting: Start가 호출된 후(혹은 OperationQueue에 의해 실행된 후) isExecuting
isCancel: Operation을 cancel하게 되면 isCancel
isFinished: cancel하지 않고 동작을 모두 마쳤다면 isFinished
var isCancelled: Bool
var isExecuting: Bool
var isFinished: Bool
var isConcurrent: Bool
var isAsynchronous: Bool
var isReady: Bool
var name: String?

2. isCancelled

operation.cancel()
  • 기대와는 달리 cancel() 메서드는 실행 중인 operation의 동작을 직접적으로 취소시키지 않음
  • cancel() 메서드는 isCancelled 프로퍼티 값만 True로 변환 시켜주는 메서드
  • operation 동작 취소를 원할 때는 cancel() 호출 후 상태 변경을 나타내는 isCancelled 프로퍼티 추적으로 작업을 관리

3. isAsynchronous

  • isAsynchronous 프로퍼티 기본값은 false
  • 아무런 설정을 해주지 않았다면 동기적으로 실행
  • 비동기 operation 이 필요하다면 커스텀 하여 작업을 진행
  • isAsynchronous은 읽기 전용이기 때문에 override 통해 값을 설정
  • operation start() 메서드를 호출하여 직접 실행 시
synchronous(동기) 시 :
- operation 실행한 현재의 스레드에서 작업을 처리

asynchronous(비동기) 시 :
- 새로운 스레드를 만들어 작업을 처리
  • OperationQueue를 사용할 시
- 동기 / 비동기와는 상관 없이 새로운 스레드를 만들어 작업을 처리

4. Dependency - 종속성

  • 종속성은 operation 인스턴스 사이 종속적인 관계를 만들어 실행의 순서를 관리
  • 기본적 operation은 실행한 순서대로 작업을 처리
  • addDependency(_:) 메서드로 종속적인 관계를 생성
  • removeDependency(_:) 메서드로 종속적인 관계 제거
  • 종속된 operation 작업 종료시 까지 실행되지 않음
import Foundation

let jimin = BlockOperation {
    print("🐻🐻🐻🐻🐻")
}

let minjung = BlockOperation {
    print("🦌🦌🦌🦌🦌")
}

let karina = BlockOperation {
    print("🌳🌳🌳🌳🌳")
}

karina.addDependency(jimin)
  • karina는 addDependency 메서드를 호출하여 jimin에 종속
  • 아래 코드 실행시 에러발생
karina.start() 
// error: Thread 1: "*** -[NSBlockOperation start]: receiver is not yet ready to execute"
  • jimin 먼저 실행시 karina 실행
jimin.start()
karina.start()

/* 출력
🐻🐻🐻🐻🐻
🌳🌳🌳🌳🌳
*/
  • 종속성 설정시 deadlock (교착상태) 발생에 유의

5. waitUntilFinished()

  • 해당 operation이 끝날 때까지 기다리는 메서드
  • deadlock (교착상태) 발생에 유의
profile
Wooyo의 개발 블로그

0개의 댓글