안녕하세요, 루피입니다.
오늘은 DispatchObject에 대해 공부 해보도록 하겠습니다. 바로 시작합니다.
DispatchObject
Dispatch Type의 가장 기본적인 Class 입니다.
설명에 따르면 DispatchQueue, DispatchGroup 그리고 DispatchSource를 포함하여 많은 Dispatch Object 타입이 있다고 합니다.
또한, 이 기본 Dispatch Object 인터페이스들은 iOS 앱 개발 시, 실제 작업의 흐름과 리소스 관리를 보다 세밀하게 제어할 수 있도록 도와준다고 하는데요.
예를 들면, 메모리 관리는 물론, 작업 실행을 일시 중지하고 재개하는 기능, 객체에 관련된 추가 정보를 설정하는 기능, 작업 중 발생한 데이터를 로깅하는 등의 다양한 작업을 수행할 수 있습니다.

activate()
Dispatch Object를 활성화시킵니다.
Dispatch Object가 한 번 활성화되면, 이후에는 이미 지정된 대상 큐를 다른 큐로 바꿀 수 없습니다. 이는 객체 실행이 시작된 이후에 큐 정보가 고정되어 변경 불가능한 상태가 됨을 의미합니다!
아마 이렇게 설명을 듣다보면 그러면.... setTarget(queue:)은 하면 안되는거 아니야??? 라고 생각 하실수 있는데요! setTarget 같은 경우는 activate를 실행하기 전에 미리 정해 줘야합니다 만약에 activate 이후에 Queue를 변경 한다면 에러가 발생합니다.
resume()
일시 중지되어 있던 Dispatch Object에 등록된 블록을 재개합니다.
이 함수를 호출하면, 일시 중지되어 있는 디스패치 큐나 이벤트 소스 객체의 일시 정지 카운트가 1씩 줄어듭니다.
카운트가 0보다 크다면, 객체는 계속 정지 상태로 남아 있으며, 카운트가 0이 되는 순간 그동안 대기 중이던 작업이나 이벤트가 실행됩니다.
단, 한 가지 예외를 제외하면 resume() 함수의 호출 수는 suspend() 함수의 호출 수와 반드시 같아야 합니다.
새로 생성된 디스패치 이벤트 소스 객체는 원래 일시 정지 카운트가 1로 설정되어 있어, 첫 이벤트가 발생하기 전에 반드시 resume()을 호출해줘야 합니다.
이를 통해 애플리케이션이 이벤트가 전달되기 전에 해당 객체를 완전히 설정할 수 있도록 보장합니다.
이해가 잘 가시나요 ? 코드를 통해 도와드리겠습니다!
// 타이머 이벤트 소스 객체 생성 (새로운 dispatch source는 일시 정지 카운트가 1로 시작)
let timer = DispatchSource.makeTimerSource(queue: DispatchQueue.global())
// 타이머를 2초 후에 시작하고 1초 간격으로 반복하도록 설정
timer.schedule(deadline: .now() + 2, repeating: 1)
// 타이머 이벤트 핸들러 설정
timer.setEventHandler {
print("타이머 이벤트 발생: \(Date())")
}
우선 타이머를 이벤트 소스 객체로 생성하고 타이머를 설정합니다.
// 이 시점에서 timer는 아직 일시 정지된 상태이므로(카운트 1),
// 첫 이벤트가 발생하기 전에 반드시 resume()을 호출해야 함.
print("타이머 설정 완료됨. 활성화 전에 이벤트가 전달되지 않음.")
// 첫 resume() 호출 (일시 정지 카운트를 0으로 만들어 이벤트 전달을 허용)
timer.resume()
print("타이머 활성화됨. 이벤트를 기다리는 중...")
// 추가 예제: 4초 후에 타이머를 일시 정지(suspend)한 후, 2초 후 다시 재개(resume)하는 코드
DispatchQueue.global().asyncAfter(deadline: .now() + 4) {
print("타이머 일시 정지 시도...")
timer.suspend() // suspend() 호출 시, 카운트가 1 증가하여 이벤트 전달이 중단됨
print("타이머 일시 정지됨.")
// suspend() 호출에 대한 균형을 맞추기 위해 2초 후 resume() 호출
DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
print("타이머 재개 시도...")
timer.resume() // suspend()에서 증가한 카운트를 감소시킴
print("타이머 재개됨.")
}
}
이후 타이머를 실행 하기 위해서 resume()을 호출해야 함을 보여주고 있습니다. 생각보다 어렵지 않지 않나요??
suspend()
Dispatch Object 에 등록된 블록 작업들의 실행을 일시적으로 중단시키는 역할을 합니다
호출 시, 현재 실행 중인 블록은 마치는 즉시 정지되고, 이후 새롭게 제출된 블록이나 이벤트들은 실행되지 않습니다.
내부적으로 suspend()를 호출할 때마다 일시 정지 카운트가 1씩 증가하고, 반대로 resume()이 호출되면 그 카운트가 감소하여, 카운트가 0이 될 때까지 객체는 정지 상태를 유지합니다.
오늘도 화이팅입니다!
'iOS > Swift' 카테고리의 다른 글
| [Swift] DispatchQueue (0) | 2025.02.19 |
|---|---|
| [Swift] GCD를 공부해봅시다. (0) | 2025.02.18 |
| [Swift] 프로토콜 (Protocol) (0) | 2025.02.06 |
| [Swift] Where절 (0) | 2025.02.05 |
| [Swift] 제네릭(Generics) (1) | 2025.02.04 |