iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해를 보고 정리한 글입니다.
let group1 = DispatchGroup()
//큐를 보낼 때, 어떤 그룹에 넣을 것인지 정해주기
DispatchQueue.global(qos: ).async(group: group1){
}
//그룹이 모두 완료되었을 때 notify는 메인에서도 실행 가능
group1.notify(queue: DispatchQueue.main){ [weak self] in
self?.texsLabel.text = "모든 작업이 완료되었습니다."
}
어떤 이유로 그룹의 완료 알림에 비동기적으로 응답 할 수 없는 경우, 대신 디스패치 그룹에서 wait메서드를 사용할 수 있다.
모든 작업이 완료될 때까지 현재 대기열을 차단하는 동기적 방법
작업이 완료될 때까지, 얼마나 오래 기다릴지 기다리는 시간을 지정하는 선택적(optional)파라미터가 필요( 지정하지 않으면 무한대기)
예) 런치스크린 상태에서 홈페이지가 아직 로딩되지 않았을 때 일정 시간 이후 그냥 넘김
queue.async(group: group1){
group1.enter() --> 입장 1
someAsyncMethod{
group1.leave() --> 퇴장 1
}
}
작업을 미리 정의해 놓고 사용하는, 큐에 제출하기 위한 객체
cancel() 메서드 존재
- 작업이 아직 시작안된경우 (아직 큐에 있을 때) - 작업이 제거됨
- 작업이 실행중인 경우 - isCancelled속성이 true로 설정됨 (직접적으로 실행중인 작업이 멈추는 것이 아님)
Notify(queue: 실행할 큐, execute: 디스패치 아이템) 메서드 존재
(직접적으로 실행 다음에 , 실행할 아이템(작업)을 지정)
공유 리소스에 접근가능한 작업 수를 제한해야 할 경우
let semaphore = DispatchSemaphore(value: 3)
queue.async(group: group1){
group1.enter() -> 입장 1
semaphore.wait() -> 일단 기다려 -1 = 2
someAsyncMethod{
group1.leave() -> 퇴장 1
semaphore.signal() -> 세마포어 숫자 +1 = 3
}
}