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(비동기) 시 :
- 새로운 스레드를 만들어 작업을 처리
- 동기 / 비동기와는 상관 없이 새로운 스레드를 만들어 작업을 처리
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()
jimin.start()
karina.start()
- 종속성 설정시 deadlock (교착상태) 발생에 유의
5. waitUntilFinished()
- 해당 operation이 끝날 때까지 기다리는 메서드
- deadlock (교착상태) 발생에 유의