Sign In
한결
Status
Empty
Assignee
Empty
DispatchQueue.global().async, DispatchGroup 으로 비동기 컨트롤하기
DispatchQueue.global() 로 백그라운드 스레드에서 task들이 동작할 수 있도록 넘겨줄 수 있다.
여기서 동기/비동기(sync/async) 방식을 정해줄 수 있다.
동기 방식으로 넘겨줄 경우, 결국 백그라운드 스레드에서 앞선 작업들이 다 진행되는 것을 main 스레드는 기다려야 하기 때문에, main 스레드가 동기적으로 task를 처리하는 것과 크게 다르지 않다.
비동기 방식으로 넘겨줄 경우, 넘겨준 작업의 시작과 종료를 기다리지 않고 main 스레드가 일을 진행할 수 있다. 다만 다른 스레드의 일이 언제 끝날지 알 겨를이 없다.
그래서, DispatchGroup을 통해서 각각의 DispatchQueue.gloabl().async 작업의 task 시작 시점(enter)과 종료 시점(leave)을 그룹 단위로 ± 할 수 있게 정해줄 수 있다.
DispatchQueue.gloabl().async(group: groupName) { 클로저 } 형태로, 비동기 코드를 그룹으로 쉽게 묶을 수 있다.
func someAsync() { let dispatchGroup = DispatchGroup() dispatchGroup.enter() DispatchQueue.global().async(group: dispatchGroup) { // api 통신과 같은 비동기 코드 실행 dispatchGroup.leave() } dispatchGroup.notify(queue: .main) { // 백그라운드 스레드에서 돌던 dispatchGroup의 비동기 코드가 모두 종료되었음을 // 메인 스레드에 전달해준다. // main 스레드가 처리할 작업 여기서 진행 } }
dispatchGroup.enter() dispatchGroup.leave() 의 호출로 그룹내 특정 비동기 코드가 종료되었음을 감지할 수 있는 장치를 만들어준다.
dispatchGroup.notify(queue: someQueue) 로 특정 스레드에 그룹의 비동기 task가 모두 종료되었음을 알려준다. 보통 main 스레드에서 비동기적 통신에 따른 UI를 그리기 때문에 큐에 .main을 반영해준다.
👍