1️⃣ Serial
2️⃣ Concurrent
1️⃣ main.async
asyncAfter은 async 메서드를 원하는 시간에 호출해줄 수 있는 메서드
DispatchQueue.global().asyncAfter(deadline: .now() + 5, execute: yellow)
DispatchQueue.global().asyncAfter(wallDeadline: .now() + 5, excute: blue)
비동기 작업이 끝나는 시점을 기다릴 수 있음
DispatchQueue.global().asyncAndWait(execute: yellow)
print("Finished!")
지난 챕터에서는 이미 구현되어 있는 DispatchQueue인 main과 global()을 사용했었는데요, 이전에 DispatchQueue도 커스텀하여 사용할 수 있다
convenience init(label: String,
qos: DispatchQoS = .unspecified,
attributes: DispatchQueue.Attributes = [],
autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = .inherit,
target: DispatchQueue? = nil)
1️⃣ label
2️⃣ qos
3️⃣ attributes
attributes
는 DispatchQueue
의 속성을 정해주는 값임.concurrent
로 초기화한다면 다중 스레드 환경에서 코드를 처리하는 DispatchQueue
가 되는 것임Serial DispatchQueue
를 만들게 됨– inherit: target과 같은 빈도를 가집니다.
– workItem: workItem이 실행될 때마다 객체들을 해제합니다.
– never: autorelease를 하지 않습니다.
5️⃣ target
메서드를 호출하면 Operation의 동작이 끝나고 난 후에 원하는 코드를 실행해줄 수 있음
static let startTask = "%d번 고객 업무 시작"
print(String(format: BankNamespace.startTask, customer.waitingNumber))
print(String(format: BankNamespace.endTask, customer.waitingNumber))
case와 static le 구분 하기
case일때만 case 사용! (feat. 나만의 기준)