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:28
728x90

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가 반복 호출되거나, 다른 시점에 상태가 바뀌는 로직이 섞이면 경고 또는 예기치 않은 동작이 생길 수 있다.

해결방법

  1. 명확한 시점에서 상태 변경
    • 버튼 탭, Task 등 “뷰가 이미 렌더링을 완료한” 시점에 변경
    • 예: .task { count += 1 }는 렌더링 이후 실행되므로 안전
  2. DispatchQueue.main.async 또는 Task 사용
    • 콜백이나 클로저 내부에서 상태를 수정해야 한다면, 바로 수정하지 않고 메인 스레드에 비동기로 예약해 렌더링이 끝난 뒤 변경
.onSuccess { _ in
    DispatchQueue.main.async {
        self.isFailed = false
    }
}
.onSuccess { _ in
    Task {
        self.isFailed = false
    }
}
  1. 뷰 로직상태 변경을 분리 (MVVM 등 아키텍처)
    • ViewModel에 상태 변환 로직을 모으고, SwiftUI 뷰는 그것을 관찰(Observe)만 한다.
    • 이렇게 하면 뷰 body 안에서 직접 상태를 만지게 될 일이 줄어듦

마무리

“Modifying state during view update” 경고는 SwiftUI가 “렌더링 중에는 상태 변경이 위험하다”라고 경고하는 것입니다.
이는 UI가 아직 업데이트 완료가 안 된 상태에서 또 다른 변경이 겹쳐, 무한 루프나 기타 예측 불가능한 에러를 초래할 수 있습니다.

  • 간단한 해결책은, 상태 변경 시점을 “뷰가 완전히 그려진 후” 또는 “명시적인 사용자 액션 발생 후”로 미룬다.
  • 콜백을 사용할 경우에는 DispatchQueue.main.async나 Task 블록을 통해 렌더링이 끝난 뒤 수정한다.
728x90
Comments