BIBI BLOG
Modifying state during view update, this will cause undefined behavior 해결하기☀️ 본문
iOS/Swift
Modifying state during view update, this will cause undefined behavior 해결하기☀️
BIBI⭐️ 2025. 4. 3. 16:28728x90
SwiftUI 에서 “Modifying state during view update” 경고가 뜨는 이유와 해결 방법
SwiftUI를 사용하다 보면, “Modifying state during view update, this will cause undefined behavior”라는 경고를 마주칠 수 있다. 이 경고가 뜻하는 바는, 화면이 그려지는 중에 상태(@State, @ObservedObject 등)를 직접 수정하면 SwiftUI 내부에서 렌더링 재진입이 발생해 예측 불가능한 동작이 일어날 수 있다는 것이다.
원인
SwiftUI는 상태 변화 → 뷰 다시 그림 → (필요시) 또 상태 변화 구조를 가진다.
만약 “뷰가 그려지는 바로 그 시점”에 또 상태를 건드리면, 아직 완료되지 않은 렌더링이 중첩 호출될 가능성이 있다.
이는 흔히 무한 렌더링 루프, 레이스 컨디션, 혹은 UI 업데이트 충돌 등의 문제로 이어질 수 있다.
예시
struct MyView: View {
@State private var count = 0
var body: some View {
Text("Count: \(count)")
.onAppear {
// 여기서 count를 즉시 증가시키면, 렌더링 과정 중에 상태가 바뀔 수 있음
count += 1
}
}
}
위 코드는 간단해 보일 수 있지만, 만약 onAppear가 반복 호출되거나, 다른 시점에 상태가 바뀌는 로직이 섞이면 경고 또는 예기치 않은 동작이 생길 수 있다.
해결방법
- 명확한 시점에서 상태 변경
- 버튼 탭, Task 등 “뷰가 이미 렌더링을 완료한” 시점에 변경
- 예: .task { count += 1 }는 렌더링 이후 실행되므로 안전
- DispatchQueue.main.async 또는 Task 사용
- 콜백이나 클로저 내부에서 상태를 수정해야 한다면, 바로 수정하지 않고 메인 스레드에 비동기로 예약해 렌더링이 끝난 뒤 변경
.onSuccess { _ in
DispatchQueue.main.async {
self.isFailed = false
}
}
.onSuccess { _ in
Task {
self.isFailed = false
}
}
- 뷰 로직과 상태 변경을 분리 (MVVM 등 아키텍처)
- ViewModel에 상태 변환 로직을 모으고, SwiftUI 뷰는 그것을 관찰(Observe)만 한다.
- 이렇게 하면 뷰 body 안에서 직접 상태를 만지게 될 일이 줄어듦
마무리
“Modifying state during view update” 경고는 SwiftUI가 “렌더링 중에는 상태 변경이 위험하다”라고 경고하는 것입니다.
이는 UI가 아직 업데이트 완료가 안 된 상태에서 또 다른 변경이 겹쳐, 무한 루프나 기타 예측 불가능한 에러를 초래할 수 있습니다.
- 간단한 해결책은, 상태 변경 시점을 “뷰가 완전히 그려진 후” 또는 “명시적인 사용자 액션 발생 후”로 미룬다.
- 콜백을 사용할 경우에는 DispatchQueue.main.async나 Task 블록을 통해 렌더링이 끝난 뒤 수정한다.
728x90
'iOS > Swift' 카테고리의 다른 글
🔍 [Swift] 문자열 포함 여부 확인 – contains 사용법과 주의할 점 (0) | 2025.04.13 |
---|---|
[Swift] self와 Self를 구분하는 법: 차이점과 예시 (0) | 2025.04.09 |
[swift] Concurrency withCheckedThrowingContinuation 알아보기 (0) | 2025.04.01 |
[Swift] Result 타입 살펴보기🏋️♀️ (0) | 2025.03.28 |
[Swift] SOLID 원칙 살펴보기 (0) | 2025.03.26 |
Comments