비동기 처리, 언제 쓰고 왜 써야 할까?
내배캠 앱 개발 입문 주차 과제를 해결하던 중 나온 고민이였다.
동기 처리란?
비동기 처리(Asynchronous Execution)는 어떤 작업을 기다리지 않고, 다른 작업을 동시에 처리할 수 있도록 해줍니다.
Swift에서는 GCD(Grand Central Dispatch)를 사용해 비동기 처리를 구현할 수 있습니다.
Dispatch | Apple Developer Documentation
Execute code concurrently on multicore hardware by submitting work to dispatch queues managed by the system.
developer.apple.com
비동기 처리가 중요한가?
iOS 앱은 대부분 단일 메인 스레드에서 동작합니다.
UI 업데이트, 사용자 이벤트 처리 등 대부분의 작업이 이 메인 스레드에서 일어나기 때문에, 여기에 오래 걸리는 작업을 넣으면 앱이 버벅이거나 멈춰버릴 수 있습니다.
DispatchQueue.main.async란?
애플 공식 설명
Submits a work item to the main dispatch queue and returns immediately.
즉, 메인 스레드에서 해야 할 작업을 "지금" 실행하는 게 아니라,
"다음 run loop"로 미뤄서 실행하라는 의미입니다.
DispatchQueue.main.async가 Run Loop에서 어떻게 동작하는가?

- 현재 실행 사이클(Run Loop) 중
사용자가 DispatchQueue.main.async를 호출하면, 작업은 즉시 실행되지 않고, **메인 큐(Main Queue)**에 추가됩니다. - 현재 작업들이 모두 완료된 후
즉, 현재 run loop 사이클의 작업들이 끝나고 나면, 그다음 run loop 사이클에서 해당 작업이 실행됩니다. - 결과적으로...
UI 업데이트를 더 안전하고 예측 가능한 시점에 실행할 수 있습니다.
언제 써야 할까?
- UI를 업데이트할 때
- 뷰의 레이아웃이 갱신되기 전이라 정확한 크기/위치를 알 수 없을 때
- 비동기 작업 후 UI 반영이 필요할 때
예시
제가 만든 프로젝트에서는 화면 회전(Portrait ↔ Landscape) 시 텍스트 줄 수가 달라지도록 처리해야 했습니다.
override func layoutSubviews() {
super.layoutSubviews()
DispatchQueue.main.async {
self.updateSummaryDisplay()
}
}
왜 DispatchQueue.main.async가 필요한가?
- layoutSubviews()는 레이아웃이 "완전히" 끝나기 전에 호출됩니다.
- 이 시점에 라벨의 줄 수를 계산하면 잘못된 width/height 값으로 판단할 수 있습니다.
- 그래서 UI 업데이트를 다음 run loop로 미뤄, 정확한 정보가 반영된 후에 처리해야 합니다.
만약 해당 부분이 없다면 영상과 같이 즉각적인 UI 변화가 아닌 다른 동작을 한번 한 후 적용되는것을 볼 수 있습니다.
'iOS > Swift' 카테고리의 다른 글
[ Swift ] Codable vs Decodable vs Encodable: 언제, 왜, 어떻게 쓸까? (0) | 2025.04.04 |
---|---|
[ Swift ] Swift 5.9 신기능: 복사 불가능한 타입 (Noncopyable Types) (0) | 2025.03.26 |
[ Swift ] ARC : Automatic Reference Counting (0) | 2025.03.25 |
[ Swift ] 접근 제어자 (0) | 2025.03.13 |
[ Swift ] 중첩 타입 (0) | 2025.03.13 |
비동기 처리, 언제 쓰고 왜 써야 할까?
내배캠 앱 개발 입문 주차 과제를 해결하던 중 나온 고민이였다.
동기 처리란?
비동기 처리(Asynchronous Execution)는 어떤 작업을 기다리지 않고, 다른 작업을 동시에 처리할 수 있도록 해줍니다.
Swift에서는 GCD(Grand Central Dispatch)를 사용해 비동기 처리를 구현할 수 있습니다.
Dispatch | Apple Developer Documentation
Execute code concurrently on multicore hardware by submitting work to dispatch queues managed by the system.
developer.apple.com
비동기 처리가 중요한가?
iOS 앱은 대부분 단일 메인 스레드에서 동작합니다.
UI 업데이트, 사용자 이벤트 처리 등 대부분의 작업이 이 메인 스레드에서 일어나기 때문에, 여기에 오래 걸리는 작업을 넣으면 앱이 버벅이거나 멈춰버릴 수 있습니다.
DispatchQueue.main.async란?
애플 공식 설명
Submits a work item to the main dispatch queue and returns immediately.
즉, 메인 스레드에서 해야 할 작업을 "지금" 실행하는 게 아니라,
"다음 run loop"로 미뤄서 실행하라는 의미입니다.
DispatchQueue.main.async가 Run Loop에서 어떻게 동작하는가?

- 현재 실행 사이클(Run Loop) 중
사용자가 DispatchQueue.main.async를 호출하면, 작업은 즉시 실행되지 않고, **메인 큐(Main Queue)**에 추가됩니다. - 현재 작업들이 모두 완료된 후
즉, 현재 run loop 사이클의 작업들이 끝나고 나면, 그다음 run loop 사이클에서 해당 작업이 실행됩니다. - 결과적으로...
UI 업데이트를 더 안전하고 예측 가능한 시점에 실행할 수 있습니다.
언제 써야 할까?
- UI를 업데이트할 때
- 뷰의 레이아웃이 갱신되기 전이라 정확한 크기/위치를 알 수 없을 때
- 비동기 작업 후 UI 반영이 필요할 때
예시
제가 만든 프로젝트에서는 화면 회전(Portrait ↔ Landscape) 시 텍스트 줄 수가 달라지도록 처리해야 했습니다.
override func layoutSubviews() {
super.layoutSubviews()
DispatchQueue.main.async {
self.updateSummaryDisplay()
}
}
왜 DispatchQueue.main.async가 필요한가?
- layoutSubviews()는 레이아웃이 "완전히" 끝나기 전에 호출됩니다.
- 이 시점에 라벨의 줄 수를 계산하면 잘못된 width/height 값으로 판단할 수 있습니다.
- 그래서 UI 업데이트를 다음 run loop로 미뤄, 정확한 정보가 반영된 후에 처리해야 합니다.
만약 해당 부분이 없다면 영상과 같이 즉각적인 UI 변화가 아닌 다른 동작을 한번 한 후 적용되는것을 볼 수 있습니다.
'iOS > Swift' 카테고리의 다른 글
[ Swift ] Codable vs Decodable vs Encodable: 언제, 왜, 어떻게 쓸까? (0) | 2025.04.04 |
---|---|
[ Swift ] Swift 5.9 신기능: 복사 불가능한 타입 (Noncopyable Types) (0) | 2025.03.26 |
[ Swift ] ARC : Automatic Reference Counting (0) | 2025.03.25 |
[ Swift ] 접근 제어자 (0) | 2025.03.13 |
[ Swift ] 중첩 타입 (0) | 2025.03.13 |