디스패치 그룹

junseole·2021년 11월 14일
0
post-thumbnail

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() 메서드 존재

  1. 작업이 아직 시작안된경우 (아직 큐에 있을 때) - 작업이 제거됨
  2. 작업이 실행중인 경우 - isCancelled속성이 true로 설정됨 (직접적으로 실행중인 작업이 멈추는 것이 아님)

빈약한 <순서 기능> 을 내장

Notify(queue: 실행할 큐, execute: 디스패치 아이템) 메서드 존재

(직접적으로 실행 다음에 , 실행할 아이템(작업)을 지정)

Semaphore의 이해

공유 리소스에 접근가능한 작업 수를 제한해야 할 경우

let semaphore = DispatchSemaphore(value: 3)

queue.async(group: group1){
  group1.enter() -> 입장 1
  semaphore.wait() -> 일단 기다려 -1 = 2
  someAsyncMethod{
    group1.leave() -> 퇴장 1
    semaphore.signal() -> 세마포어 숫자 +1 = 3
  }
}
profile
Swift와 함께 여행중입니다.

0개의 댓글