Dispatch Group
작업들의 모음, 그룹지어진 작업들이 어느 시점에 모두 완료되는 지가 관심사
1). 동기적인 함수 작업들이 완료될 때
2). 비동기적인 함수 작업들이 완료될 때 (주의!!)
서로 같은 색끼리 유사한 작업인데, 보라색/하늘색/빨간색 작업이 끝나는 시점을 아는 것이 DispatchGroup
작업을 그룹 짓고, 각 그룹별로 끝나는 시점을 알고 싶다!!!!!
특정 그룹의 모든 작업이 완료된 시점을 활용해서 무언가를 하고 싶다 이거임.
왜 이 개념이 필요할까?
예를 들면, 여러 애니메이션 효과가 겹쳐 있을때, 애니메이션이 모두 종료된 시점을 알고 싶다.
런치스크린 후에 앱 첫 화면에 브랜드 이미지가 다운로드가 덜 되어 있는 상황이라면 사용자가 에러라고 인식할 수도 있을 것임
첫 화면을 띄울 때는 다운로드가 다 되고나서 하자!라고 기획할 수 있을 것인데
이 때 DispatchGroup을 사용할 수 있을 것임
🔰1). 동기적인 작업들을 보낼 때의 DispatchGroup
그니까, task들이 동기적으로 끝나는 것들
group1이라는 DispatchGroup을 생성하고
작업(task)들을 스레드로 보낼 때 async 메소드 안에 group1이라는 걸 명시해주면 group1에 작업들이 묶이게 된다.
notify의 queue 파라미터 안에는 어떤 큐에서 작업을 실행할 것인지를 명시해준다.
그림으로 보면 아래처럼 된다.
꼬리표처럼 group1을 붙여주고, notify까지!
실제 코드로 보면,
그리고 동기적으로 기다릴 수 있음
어떻게 기다릴 수 있냐?
DispatchGroup에서 모든 작업이 완료될 때까지 현재 대기열을 block하고 wait() 메소드를 통해서 기다릴 수 있음
1. wait 메소드는 메인 스레드(1번 스레드)에서 작동시킬 경우, 앱이 멈추게 된다.
즉, 메인 스레드가 아닌 다른 스레드에서는 wait 메서드를 사용할 수 있다.
2. 근데 만약 "나는 마냥 기다리고만 있을 수는 없다. 60초까지만 기다리고 그 후에는 실행하겠다."인 경우에는,,,
🔰2). 비동기적인 작업들을 보낼 때의 DispatchGroup
예를 들어, task들이 urlSession 같은 경우
클로저 내에서 비동기 함수 작업들이 호출될 때 어떤 문제가 있을까?
비동기 함수가 호출이 되면 일이 끝나는 시점을 잘못 인식할 수 있다.
그러면 어떤 처리를 해야 올바르게 알 수 있는가?
enter - leave 표기를 통해서 제대로 인식하게 해줘야 한다.
실제 코드를 보면, 비동기 함수가 시작되고 끝나는 시점에 enter - leave를 붙여준다.
근데 이거를 언제... 써....? 어려월
'⭐️ 개발 > iOS Concurrency' 카테고리의 다른 글
[GCD] Swift Concurrency - GCD (1) | 2022.09.02 |
---|---|
[GCD] weak self (1) | 2022.08.20 |
[GCD] 섹션 1~3 요약정리 (3) | 2022.08.18 |