# Untitled

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) { 클로저 }` 형태로, 비동기 코드를 그룹으로 쉽게 묶을 수 있다.

```javascript
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을 반영해준다.

For the site tree, see the [root Markdown](https://slashpage.com/hankyeol.md).
