작업을 취소하는 방법과 여러 작업을 그룹으로 묶는 방법
여기서는 DispatchWorkItem Instance를 이용한 취소를 구현한다.
//GCD에서 하나의 작업을 나타내는 타입
var currentWorkItem: DispatchWorkItem?
@IBAction func submitWorkItem(_ sender: Any) {
currentWorkItem = DispatchWorkItem(block: {
for num in 0 ..< 100 {
print(num, separator: "", terminator: " ")
Thread.sleep(forTimeInterval: 0.1)
}
})
if let currentWorkItem{
concurrentQueue.async(execute: currentWorkItem)
}
}
isCancelled
속성으로 확인var currentWorkItem: DispatchWorkItem?
@IBAction func submitWorkItem(_ sender: Any) {
currentWorkItem = DispatchWorkItem(block: { [weak self] in
for num in 0 ..< 100 {
//isCancelled 속성을 저장해둔 workItem을 통해 접근
guard let item = self?.currentWorkItem, !item.isCancelled else {return}
print(num, separator: "", terminator: " ")
Thread.sleep(forTimeInterval: 0.1)
}
})
if let currentWorkItem{
concurrentQueue.async(execute: currentWorkItem)
}
currentWorkItem?.notify(queue: concurrentQueue){
print("Done")
}
}
@IBAction func cancelWorkItem(_ sender: Any) {
//취소
currentWorkItem?.cancel()
}
currentWorkItem?.notify(queue: concurrentQueue){
print("Done")
}
let group = DispatchGroup() //그룹 생성
@IBAction func runGroup(_ sender: Any) {
group.enter()
concurrentQueue.async {
for _ in 0 ..< 10 {
print("💩")
Thread.sleep(forTimeInterval: 0.1)
}
self.group.leave()
}
...
group.leave()
@IBAction func runGroup(_ sender: Any) {
concurrentQueue.async(group: group) {
for _ in 0 ..< 10 {
print("💩")
Thread.sleep(forTimeInterval: 0.1)
}
}
...
notify
메소드가 있다.group.notify(queue: DispatchQueue.main){
print("Done")
}