Dispatch WorkItem 개념
- Dispatch WorkItem 이란?
- Dispatch WorkItem(Class)는 Task를 캡슐화 하는데 사용합니다.
- Dispatch WorkItem은 Closure 형태로 실제 Queue에서 실행을 합니다.
let item1 = DispatchWorkItem(qos: .utility) {
print("task1 출력")
print("task2 출력")
print("task3 출력")
}
let item2 = DispatchWorkItem(qos: .utility) {
print("task4 출력")
print("task5 출력")
print("task6 출력")
}
let queue = DispatchQueue(label: "runQueue")
queue.async(execute: item1)
queue.async(execute: item2)
실행 결과

perform
- perform : 현재 쓰레드에서 작업을 동기적으로 실행합니다.
let item1 = DispatchWorkItem(qos: .utility) {
for i in 0...5 {
print("item 1 실행 \(i)")
}
}
item1.perform()
실행 결과

- Dispatch WorkItem cancel() 메서드를 사용하여 작업을 제거
- cancel 메서드는 현재 작업 항목을 비동기적으로 취소합니다.
let item1 = DispatchWorkItem(qos: .utility) {
print("cancel 작업 실행")
}
let item2 = DispatchWorkItem(qos: .utility) {
print("task4 출력")
print("task5 출력")
print("task6 출력")
}
item1.cancel()
let queue = DispatchQueue(label: "runQueue")
queue.async(execute: item1)
queue.async(execute: item2)
실행결과

notify(queue: DispatchQueue, execute: DispatchWorkItem) 을 사용하여 현재 작업 항목이 완료된 후 지정된 작업 항목의 실행을 예약합니다.
let queue = DispatchQueue(label: "runQueue", attributes: .concurrent)
let workItem1 = DispatchWorkItem(qos: .utility) {
print("task1 작업 시작")
print("task1 작업 완료")
}
let workItme2 = DispatchWorkItem(qos: .utility) {
print("task2 작업 시작")
print("task2 작업 완료")
}
workItem1.notify(queue: DispatchQueue.global(), execute: workItme2)
queue.async(execute: workItem1)
실행 결과

Concurrent Queue에 실행대고 불구하고 Serial Queue처럼 작업이 실행되는 이유는 notify가 WorkItem1의 작업이 끝난후에 WorkItme2를 실행할수 있기때문에 Serial Queue처럼 작업이 실행이 된다.