mac os업데이트와 xcode 툴 업데이트 후 아래 포스팅과 같은 오류가 발생하여 그동안 어플 업데이트를 진행하지 못했다.
언제부터 발생한 오류인지는 모르지만 내가 직면한 시기는 2025년 1월이었고, 3개월 간 업데이트를 못해서 사용자 유입에 많은 애로 사항이 있었다.
지난 밤 혹시나 하는 마음에 xcode 업데이트가 있는지 확인했는데,
업데이트가 있었고, 업데이트 받은 후 실행했는데 여전히 아래와 같은 오류가 발생했다.
[Xcode] Can’t find or decode reasons Failed to get or decode unavailable reasons 워닝 해결방법?
그럼 혹시 맥os업데이트가 있는지 확인했는데, 업데이트가 있네?
바로 업데이트 후 xcode를 실행해서 위 오류는 해결되었는데,
아래와 같은 오류가 발생되었다.
Timed out waiting for the exit barrier block. activeSendTransactions=10
오류가 발생하면서 어플도 실행이 중지되었다.
Timed out waiting for the exit barrier block. activeSendTransactions=10
macOS 앱이 UI 관련 작업을 적절하게 처리하지 못할 때 발생하는 경우가 많다. 특히 메인 스레드에서 비동기 작업이 너무 오래 걸리거나, SwiftUI의 상태 관리가 꼬였을 때 발생할 수 있다.
오류가 발생한 스위프트UI 코드는 아래와 같다.
.onAppear() {
DispatchQueue.main.async {
NSLog("## onAppear")
PersistanceManager.instance.loadChoceSong()
choice = PersistanceManager.instance.choiceSong
print("load choice : \(choice)")
}
}
DispatchQueue.main.async
블록 안에서 실행하도록 개발되어 있는데도 발생되었다.
PersistanceManager.instance.loadChoceSong() 이 부분에서 메인 스레드가 블로킹되거나, loadChoceSong()
내부에서 비동기 작업이 적절히 처리되지 않아서 Timed out waiting for the exit barrier block
오류가 발생할 가능성이 높다
해결방법은?
비동기 작업을 메인 스레드에서 실행하지 않기
현재 PersistanceManager.instance.loadChoceSong()
이 데이터를 로드하는 작업이다. 이 작업이 시간이 오래 걸리는지 확인해야하고, 만약 파일 I/O 또는 데이터베이스 작업이 포함되어 있다면, 백그라운드 스레드에서 실행해야 한다.
아래와 같이 코드를 수정하였다.
.onAppear() {
DispatchQueue.global(qos: .background).async { // 백그라운드 스레드에서 실행
NSLog("## onAppear - Loading data")
PersistanceManager.instance.loadChoceSong()
DispatchQueue.main.async { // UI 업데이트는 메인 스레드에서!
choice = PersistanceManager.instance.choiceSong
print("load choice : \(choice)")
}
}
}
loadChoceSong()
이 백그라운드에서 실행되고, 결과를 가져와 UI를 업데이트하는 부분만 메인 스레드에서 실행돼서 UI가 멈추는 현상을 방지할 수 있다.
오류는 해결되었지만
어플이 실행된 후 죽는 문제는 또 다른 문제인 것 같다.
메인 화면에서 팝업창만 띄워도 죽어버린다.