TIL
🌱 난 오늘 무엇을 공부했을까?
📌 야곰닷넷 - Concurrency Programming 심화
📍 DispatchQueue의 초기화
convenience init(label: String,
qos: DispatchQoS = .unspecified,
attributes: DispatchQueue.Attributes = [],
autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = .inherit,
target: DispatchQueue? = nil)
🔗 label
- 디버깅 환경에서 추적하기 위해서 작성하는 String
- 여러개의 DispatchQueue를 구분하기 위해서 사용
🔗 qos
무엇에 더 많은 에너지를 쏟을지 정하는 우선순위
- 우선 순위가 높을 수록 더 많은 전력
- User-interactive <-- 가장 높음
- User-initiated
- Default
- Utility
- Background
- Unspecified <-- 가장 낮음
🔗 attributes
- DispatchQueue의 속성
- .concurrent : 다중 스레드 환경에서 코드를 처리
- .initiallyInactive : sync나 async를 호출하더라도 작업을 큐에 담아놓을 뿐, active()를 호출하기 전까지는 작업을 처리하지 않는 것
let grootDispatchQueue = DispatchQueue(label: "groot", attributes: .initiallyInactive)
grootDispatchQueue.async {
print("active를 실행해야 코드 블록 호출")
}
grootDispatchQueue.activate()
- 기본 값으로 아무 설정을 하지 않는다면 Serial
🔗 autoreleaseFrequency
- DispatchQueue가 자동으로 객체를 해제하는 빈도의 값을 결정하는 파라미터
- 객체를 autorealease해주는 빈도이며 기본값은 inherit입니다.
- inherit: target과 같은 빈도를 가집니다.
- workItem: workItem이 실행될 때마다 객체들을 해제합니다.
- never: autorelease를 하지 않습니다.
🔗 target
- 코드 블록을 실행할 큐를 target으로 설정
📍 async
func async(group: DispatchGroup? = nil, qos: DispatchQoS = .unspecified, flags: DispatchWorkItemFlags = [], execute work: @escaping () -> Void)
🔗 group
- DispatchQueue의 async 코드 블록을 묶어서 관리해주는 DispatchGroup
- DispatchGroup은 비동기적으로 처리되는 작업들을 그룹으로 묶어, 그룹 단위로 작업 상태를 추적할 수 있는 기능
이때 묶어줄 async 작업들이 꼭 같은 큐, 스레드에 있지 않더라도 묶어줄 수 있다.
group에 등록하기: enter, leave
- DispatchGroup을 사용하는 방법은 2가지
– async를 호출하면서 파라미터로 group을 지정하는 방법.
– enter, leave를 코드의 앞뒤로 호출하여 group을 지정하는 방법.
let group = DispatchGroup()
DispatchQueue.main.async(group: group) {}
DispatchQueue.global().async(group: group) {}
group.enter()
DispatchQueue.main.async {}
DispatchQueue.global().async {}
group.leave()
group.notify(queue: .main) {
print("모든 작업이 끝났습니다.")
}
group.wait()
print("모든 작업이 끝났습니다.")
notify
notify는 DispatchGroup의 업무 처리가 끝나는 시점에 원하는 동작을 수행하기 위한 메서드
wait
- wait는 DispatchGroup의 수행이 끝나기를 기다리기만 하는 메서드입니다.
notify와 달리 별도의 코드 블록을 실행하지 않는다.
- wait 메서드에는 timeout 파라미터를 설정해줄 수 있다.
- 만약 timeout에 10을 전달하면 group을 딱 10초 동안만 기다리는 것
만약 10초가 넘어갔는데도 group의 작업이 끝나지 않는다면 더 이상 기다리지 않고 다음 코드를 실행
🔗 qos
무엇에 더 많은 에너지를 쏟을지 정하는 우선순위
🔗 flags
- DispatchWorkItemFlags 타입의 값을 받는 파라미터
- assingCurrentContext: 코드 블록을 실행하는 context(Queue 혹은 스레드)의 속성을 상속받습니다. QoS와 같은 속성을 동일하게 한다는 이야기입니다.
- barrier: concurrnet queue 환경에서 barrier(장벽, 차단) 역할을 합니다. barrier 속성의 코드 블록이 실행되기 전에 실행되었던 코드들은 완료까지 실행되고, barrier 속성의 코드 블록이 실행되기 전까지 다른 코드 블록은 실행되지 않습니다.
- detached: 실행할 코드 블록에 실행 중인 context(Queue 혹은 스레드)의 속성을 적용하지 않습니다.
- enforceQoS: 실행 중인 context의 QoS보다 실행할 코드 블록의 QoS에 더 높은 우선 순위를 부여합니다.
- inheritQoS: enforceQoS와 반대로 실행 중인 context의 QoS에 더 높은 우선 순위를 부여합니다.
- noQoS: QoS를 할당하지 않고 코드 블록을 실행시킵니다. assingCurrentContext보다 우선시 되는 속성입니다.
🔗 completionHandler
- 함수의 실행순서를 보장받을 수 있는 클로저
- completionHandler와 같은 클로져를 사용하는 경우에는 비동기 메서드일 때에도 작업이 종료되는 시점을 추적할 수 있고, 순서를 보장받을 수 있다.
참고 - 야곰닷넷