티스토리 뷰
DispatchWorkItem
수행할 작업에 컴플리션 핸들이나 의존성 실행을 연결하는 방법으로 캡슐화합니다.
Overview
디스패치 큐나 디스패치 그룹에서 작업을 캡슐화합니다.
perfome()
let workItem = DispatchWorkItem {
print(Thread.current)
for i in 1...10 {
print("❤️", i)
}
}
workItem.perform()
queue.async(execute:)
let serialQueue = DispatchQueue(label: "serialQueue")
let workItem = DispatchWorkItem {
print(Thread.current)
for i in 1...10 {
print("❤️", i)
}
}
serialQueue.async(execute: workItem)
queue.async(group:execute:)
let myGroup = DispatchGroup()
let serialQueue = DispatchQueue(label: "serialQueue")
let workItem = DispatchWorkItem {
print(Thread.current)
for i in 1...10 {
print("❤️", i)
}
}
serialQueue.async(group: myGroup) {
print(Thread.current)
for i in 1...10 {
print("💚", i)
}
}
myGroup.notify(queue: .main) {
print("DONE - 1")
}
serialQueue.async(group: myGroup ,execute: workItem)
notify
let serialQueue = DispatchQueue(label: "serialQueue")
let workItem = DispatchWorkItem {
print(Thread.current)
for i in 1...10 {
print("❤️", i)
}
}
serialQueue.async(execute: workItem)
workItem.notify(queue: .main) {
print("DONE")
}
wait
let serialQueue = DispatchQueue(label: "serialQueue")
let workItem = DispatchWorkItem {
print(Thread.current)
for i in 1...10 {
print("❤️", i)
}
}
serialQueue.async(execute: workItem)
print("#1")
workItem.wait()
print("#2")
.wait()를 호출하면 workItem이 끝날 때까지 print("#2")가 호출되지 않습니다.
workItem이 종료된 후 #2가 프린트되는 것을 볼 수 있습니다.
DispatchGroup
한 단위로 모니터하는 작업 그룹
Overview
그룹은 작업 목록을 종합하고 동작을 동기화할 수 있습니다.
여러 작업을 그룹에 연결하고 동일한 큐나 다른 큐에서 비동기식으로 실행하도록 계획할 수 있습니다.
모든 작업의 실행이 완료되면 그룹이 컴플리션 핸들러를 실행합니다.
모든 그룹의 작업이 실행을 종료할 때까지 동기적으로 wait할 수 있습니다.
아래 식을 보겠습니다.
let myGroup = DispatchGroup()
let serialQueue = DispatchQueue(label: "serialQueue")
let concurrentQueue = DispatchQueue(label: "concurrentQueue", attributes: .concurrent)
serialQueue.async(group: myGroup) {
print(Thread.current)
for i in 1...10 {
print("❤️", i)
}
}
serialQueue.async(group: myGroup) {
print(Thread.current)
for i in 1...10 {
print("💚", i)
}
}
myGroup.notify(queue: .main) {
print("DONE - 1")
}
concurrentQueue.async(group: myGroup) {
print(Thread.current)
for i in 1...10 {
print("💛", i)
}
}
myGroup.notify(queue: .main) {
print("DONE - 2")
}
serialQueue인 빨간 하트와 초록 하트는 순차적으로 실행됩니다.
concurrentQueue인 노란 하트는 시리얼 큐와 관계없이 실행됩니다.
notify는 DispatchGroup이 모두 끝나고 나서 호출됩니다.
그래서 하트가 모두 나오고 DONE - 1과 DONE - 2가 마지막에 출력됩니다.
developer.apple.com/documentation/dispatch/dispatchworkitem
developer.apple.com/documentation/dispatch/dispatchgroup
'iOS' 카테고리의 다른 글
[iOS] frame과 bounds (1) | 2021.01.20 |
---|---|
[iOS] Operation 알아보기 (0) | 2021.01.20 |
[iOS] DispatchQueue 알아보기 - SerialQueue, ConcurrentQueue, QoS, concurrentPerform (0) | 2021.01.18 |
[iOS] DispatchQueue 알아보기 (0) | 2021.01.18 |
[iOS] Dispatch 프레임워크 알아보기 (0) | 2021.01.18 |
댓글
공지사항