안녕하세여 린다임니다.
저번 글에 이어서 GCD의 DispatchWorkItem, Semaphore에 대해서 정리해보려고 해요.
조금 길어서.. 나누어서 글을 올려봅니다.
마찬가지로 앨런님의 강의를 보고 정리한 글입니다!
(https://sy-catbutler.tistory.com/31)
밑에서부터 편한 말투로 정리할게요!
Dispatch WorkItem
- 작업을 클래스화 한 객체 (클로저가 아니라 작업 자체를 클래스화 하기)
- DispatchQueue에 제출할 수 있는 경량 작업 단위
- 그룹은 여러 가지 일을 묶는 것이라면 workItem은 실행될 수 있는 단일 작업 단위 또는 클로저
생성 방법
let item1 = DispatchWorkItem(qos: .utility) {
print("task1 : 출력하기")
print("task2 : 출력하기")
}
let item2 = DispatchWorkItem {
print("task3 : 출력하기")
print("task4 : 출력하기")
}
let queue = DispatchQueue(label: "com.inflearn.serial")
queue.async(execute: item1)
queue.async(execute: item2)
특징1. 빈약한 <취소 기능>을 내장
- cancel() 메서드 존재함
- 작업 항목의 실행을 취소할 때 사용
- 작업 항목이 시작되기 전이나 실행 중에 취소되면 관련 클로저가 실행되지 않고 대기 중인 모든 스레드가 차단 해제됨
* wait() 메서드도 있음
- 작업 항목이 완료될 때까지 현재 스레드를 차단하는 데 사용
특징2. 빈약한 <순서 기능>을 내장
notify(queue: 실행할 큐, execute: 디스패치아이템) 메서드 존재
=> 직접적으로 실행 다음에, 실행할 아이템(작업)을 지정
DispatchGroup와 DispatchWorkItem 비교하기
- 동시에 실행할 수 있는 독립적인 작업이 있고 해당 작업의 실행을 제어하거나 완료를 기다리거나 개별적으로 취소하려는 경우 DispatchWorkItem을 사용
- 두 번째 작업이 첫 번째 작업 완료에 따라 달라지는 두 개의 작업이 있을 경우, DispatchGroup를 사용하여 완료될 때까지 기다린 후 사용. 즉 종속 작업이 있는 경우에는 DispatchGroup를 사용
Dispatch Semaphore (수기 신호)
- 공유 리소스에 접근 가능한 작업 수를 제한해야할 경우에 사용함
let semaphore = DispatchSemahore(value: 3)
// 한번에 3개의 작업만 실행될 수 있다는 말
queue.async(group: group1) {
group1.enter()
semaphore.wait() // 일단 기다리기
someAsyncMethod {
group1.leave()
semaphore.signal() // 다음 작업에 대한 신호
}
}
즉, 세마포어는 작업의 수를 제한하는 것까지만 알아놓으면 될것 같습니다..
'Swift' 카테고리의 다른 글
Tuist의 의존성 관리 방법과 Ignoring duplicate libraries: '-lc++' 에러 해결하기 (0) | 2024.02.09 |
---|---|
Tuist와 Signing, Tuist 에서 프로비저닝 프로파일 설정하기 (0) | 2024.02.05 |
DispatchQueue(GCD)를 알아보자3, DispatchGroup과 wait/enter/leave까지.. (1) | 2024.01.15 |
SwiftUI로 디자인 시스템(Design System)을 구현해보자 (SYM - Part 1) (1) | 2024.01.06 |
냅다 정리해보는 Combine 개념, (Combine을 알아보자 1) (0) | 2023.12.10 |