dismiss() 사용하니깐 앱이 멈추는 현상

Jehyeon Lee·2024년 9월 13일
0
post-thumbnail

문제

앱이 정상적으로 작동하다가 밑에 코드를 넣은순간부터 앱이 정지 되고 무한루프가 돌았습니다. CPU99%;;

@Environment(\.dismiss) var dismiss

dismiss()

미친듯이 올라가는 메모리 ㄷㄷ;;

추가적으로 뜨는 메시지

이 디버깅 메시지의 뜻은

  • 과도한 네트워크 이벤트: 네트워크 연결에서 많은 이벤트가 발생하고, 각 이벤트에는 타임스탬프가 기록된다 합니다. 하지만 특정 연결에서 기록할 수 있는 타임스탬프의 최대 한도에 도달하면, 더 이상 기록할 수 없기에 이벤트가 무시된다 합니다.
  • 네트워크 부하: 앱에서 많은 네트워크 요청을 하거나 연결이 불안정한 경우, 짧은 시간 내에 다수의 네트워크 이벤트가 발생할 수 있습니다. 이로 인해 발생하는 메시지입니다.

라는 의미라고 합니다 .

이렇게 보면 api 쪽의 문제인줄 알고 전부 봐왔지만 ..

고작 이거 하나 받아오는 코드인데 ?? 알고보니 api의 문제가 아니였습니다..

원인

@Environment(\\.dismiss) private var dismiss

문제의 코드 ; 고작 뒤로가기가?

뷰를 이동할 때 @Environment 변수를 사용하는 모든 뷰의 body 내부 코드를 재실행한다고 합니다.
이렇게 되면 앱 성능과 메모리 등 부정적인 영향을 미치고 앱이 오랫동안 저걸 사용하는 뷰에서 멈춘다면 리소스 사용량이 급증하게 된다고 합니다.

NavigationStack으로 옮긴 후로 iOS 16/17에서 같은 문제가 발생하고 있으며 무한 루프의 원인을 정확히 알 수 없습니다.
무한 루프가 되니 cpu와 메모리가 급증하며 앱이 멈춰버린것입니다..!

해결

@Environment가 있는 뷰들이 많은데 계속 무한 루프로 하위 뷰들의 body를 그리다가 timestamp 의 count가 맥시멈도 되고 CPU memory도 지구 끝까지 올라가면서 정지된듯해요.
그래서 iOS 15 전버전에서 사용되던 @Environment(.presentationMode)를 가져와서 사용하니 해결됐씁니다!!

@Environment(\.presentationMode) var presentationMode
presentationMode.wrappedValue.dismiss()

참고

profile
공부한거 느낌대로 써내려갑니당

0개의 댓글

관련 채용 정보