[iOS] 차근차근 시작하는 GCD — 9

DispatchWorkItem 에 대해 알아봅시다

naljin
6 min readFeb 1, 2021

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 }

이렇게 정의된 DispatchWorkItemasync(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. 취소 기능

DispatchWorkItemcancel() 이라는 instance method를 가지고 있습니다.

let item = DispatchWorkItem { }item.cancel()

이름에서부터 알 수 있듯 작업을 취소 하는거겠죠? 그런데 이 함수는 작업의 실행 여부에 따라 동작이 조금 달라집니다.

  • 작업 실행 전

작업이 아직 큐에 있는 상황입니다. 이때 cancel() 을 호출하면 작업이 제거됩니다.

  • 작업 실행 중

실행 중인 작업에 cancel()을 호출하는 경우, 작업이 멈추지는 않DispatchWorkItem 의 속성인 inCancelledtrue 로 설정됩니다.

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~!

샷 다 내 려

이전 포스팅 👈🏻

다음 포스팅 👉🏻

출처

--

--