
TIL 25일 차 - [Swift] DispatchQueue 트러블 슈팅 정리
문제 상황
MVVM 구조에서 ViewModel이 비동기로 데이터를 처리한 뒤에 ViewController에서 UI를 업데이트해야 하는 상황
// VM에서 데이터가 변경되었을 때 View 업데이트
viewModel.onDataUpdated = {
self.updateView()
}
해당 코드 문제 원인
1. UI 작업은 메인 스레드에서만 가능한데 백그라운드 스레드(Viewodel)에서 UI를 변경하려고 함
2. 강한 참조로 인한 메모리 누수 가능성이 있음
(클로저는 기본적으로 self를 강하게 참조하여 ViewModel이 ViewController를 계속 잡고 있는 상태가 됨)
해결 방법
1. 메인 쓰레드에서 UI 업데이트
(UI 관련 작업을 Main Queue로 명시적으로 전달하여 스레드 안정성을 확보함)
DispatchQueue.main.async {
self?.updateView()
}
2. [weak self] 사용으로 순환 참조 방지
(ViewController가 화면에서 사라지면 정상적으로 메모리 해제 되어 메모리 누수가 방지됨)
viewModel.onDataUpdated = { [weak self] in
DispatchQueue.main.async {
self?.updateView()
}
}
배운 점: ViewModel에서 비동기로 처리된 결과를 View에서 UI로 반영할 때는 반드시 메인스레드에서 처리해야 하고,
클로저 내에서는 [weak self]를 사용해 메모리 누수를 방지해야 한다.
'iOS > Swift ' 카테고리의 다른 글
| [Swift 알고리즘] 2018 KAKAO BLIND RECRUITMENT 비밀지도 문제 2가지 풀이 (0) | 2026.02.02 |
|---|---|
| [iOS-Swift] 동시성 Concurreuncy (0) | 2026.01.30 |
| [Swift 알고리즘] 2022 KAKAO BLIND RECRUITMENT 신고 결과 받기 문제 풀이 (0) | 2026.01.29 |
| [Swift 알고리즘] 2024 kakao winter internship 가장 많이 받은 선물 알고리즘 풀이 (0) | 2026.01.26 |
| [iOS-Swift] 심화 문법 - 숫자 야구 게임 최종 리팩토링 (1) | 2026.01.21 |