convenience init(label: String,
qos: DispatchQoS = .unspecified,
attributes: DispatchQueue.Attributes = [],
autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = .inherit,
target: DispatchQueue? = nil)
복붙복붙
1️⃣ User-interactive
2️⃣ User-initiated
3️⃣ Default
4️⃣ Utility
5️⃣ Background
6️⃣ Unspecified
DispatchQueue의 속성을 정해준다.
기본값: Serial 값으로 생성된다. (main)
.concurrent: 다중 스레드로 DispatchQueue를 생성한다. (global())
.initiallyInActive: 작업을 큐에 담아놓을 뿐, active()를 호출하기 전까지는 작업을 처리하지 않도록 할 수 있다. DispatchWorkItem을 사용
import Foundation
let yellow = DispatchWorkItem {
for _ in 1...5 {
print("😀😀😀😀😀")
sleep(1)
}
}
let myDispatch = DispatchQueue(label: "Odong", attributes: .initiallyInactive)
myDispatch.async(execute: yellow) // 코드 블록 호출 안됨.
myDispatch.activate()
비동기적으로 처리되는 작업들을 그룹으로 묶어, 그룹 단위로 작업 상태를 추적할 수 있는 기능
이를 통해 async들을 묶어서 그룹의 작업이 끝나는 시점을 추적하여 어떠한 동작을 수행시킬 수 있다. 묶어줄 async 작업들이 꼭 같은 큐, 스레드에 있지 않더라도 묶어줄 수 있습니다.
반드시 async에서만 사용이 가능하다.
사용하는 방법은 다음과 같다
let group = DispatchGroup()
// enter, leave를 사용하지 않는 경우
DispatchQueue.main.async(group: group) {}
DispatchQueue.global().async(group: group) {}
// enter, leave를 사용하는 경우
group.enter()
DispatchQueue.main.async {} // group에 포함되게 된다
DispatchQueue.global().async {} // group에 포함되게 된다
group.leave()
notify를 이용해 작업이 끝나고 원하는 동작을 수행시킬 수 있다.
group.notify(queue: .main) {
print("모든 작업이 끝났습니다.")
}
wait을 통해 DispatchGroup의 수행이 끝나기를 기다리도록 할 수 있다.
timeout
파라미터를 입력해서 기다릴 시간을 지정시킬 수 있다. 기다린 시간이 지나면 더 이상 기다리지 않고 바로 다음 작업을 수행한다.출처: 야곰닷넷 동시성 프로그래밍 강좌