[iOS] 차근차근 시작하는 GCD — 9
Previously on GCD…
지난 시간에는 Dispatch Group에 비동기 작업이 포함된 task 를 보낼때는 enter()
와 leave()
를 사용해야 함! 까지 살펴보았는데요, 이번 시간에는 DispatchWorkItem
을 알아보도록 합시다.
DispatchWorkItem
우리는 지금까지 원하는 작업들을 클로저 안에 넣어서 처리해왔습니다.
그러다 이런 생각을 하게 됐을지도 모르죠..!
🤔 : 흠.. 나는 작업들을 closure 묶어 보내는 대신, 아예 class 로 캡슐화해서 묶어버리고 싶다고!
앗 물론 이렇게 생각한 사람에 저는 포함되지 않습니다 ◠‿◠ 튼 이제 무슨 말이 나올지 아시겠죠? ㅎㅎ
DispatchWorkItem
은 지금껏 closure로 보내왔던 작업이 캡슐화 된 class입니다.
원래 클로저로 묶여 있던게 DispatchWorkItem
으로 한 번 더 감싸져있죠? ㅎ
let utilityItem = DispatchWorkItem(qos: .utility) {
print("Task 시작")
print("Task 끝")
}
let defaultItem = DispatchWorkItem {
print("Task 시작")
print("Task 끝")
}
보다시피 DispatchWorkItem
를 생성할 때, qos
파라미터를 통해 작업의 우선순위 (default는 unspecified
) 도 설정할 수 있는데요! 이는 기존 (task를 closure 로 보낼 때) async
함수의 qos
에서 작업의 우선 순위를 설정한 것과 같은 일이랍니다.
queue.async(qos: .utility){ //closure }
이렇게 정의된 DispatchWorkItem
은 async(execute:)
라는 DispatchQueue
의 instance method를 통해 큐에 보낼 수 있습니다.
let utilityItem = DispatchWorkItem(qos: .utility) {
print("Task 시작")
print("Task 끝")
}DispatchQueue.global().async(execute: utilityItem)
아니면 perform()
메소드를 통해 현재 스레드에서 sync 하게 동작시킬 수 도 있구요!
utilityItem.perform()
DispatchWorkItem의 기능
DispatchWorkItem
은 아래와 같은 두가지 기능 제공합니다.
1. 취소 기능
DispatchWorkItem
은 cancel()
이라는 instance method를 가지고 있습니다.
let item = DispatchWorkItem { }item.cancel()
이름에서부터 알 수 있듯 작업을 취소 하는거겠죠? 그런데 이 함수는 작업의 실행 여부에 따라 동작이 조금 달라집니다.
- 작업 실행 전
즉 작업이 아직 큐에 있는 상황입니다. 이때 cancel()
을 호출하면 작업이 제거됩니다.
- 작업 실행 중
실행 중인 작업에 cancel()
을 호출하는 경우, 작업이 멈추지는 않고 DispatchWorkItem
의 속성인 inCancelled
가 true
로 설정됩니다.
2. 순서 기능
notify(queue:execute:)
라는 함수를 통해 작업 A가 끝난 후 작업 B가 특정 queue에서 실행되도록 지정할 수 있습니다.
let itemA = DispatchWorkItem { }
let itemB = DispatchWorkItem { }itemA.notify(queue: DispatchQueue.global(), execute: itemB)
해당 함수는 앞서 살펴본 cancel()
과 마찬가지로 DispatchWorkItem
의 인스턴스 메소드랍니다.
마지막 라인을 그냥 영어 직독직해 하듯 읽어보면
itemA가 notify 한다. queue에게. execute하라고. itemB를.
이런 식으로 읽히지 않나요? ㅎㅎ
마무리
오늘은 간단히 DispatchWorkItem
의 개념 및 실행 방법과 취소 / 순서 기능을 알아보았습니다! DispatchWorkItem
의 더 많은 기능을 알고 싶다면 애플 공식문서로 고고!
흠,, 지금 강의 진도 상으로는 GCD
까지 다 듣긴 했는데.. 빠른 시일 내 다 정리할 수 있을까요?! ㅎㅎ 어차피 한번 더 들으려고는 했지만 처음에 강의 들으면서 적은 노트도 오류로 날라가서리.. ㅠ 튼 2월에는 열심히 살아보길 다짐하며! 그럼 전 20000~!