swift를 사용하여 OS X 에서이 오류가 많이 발생했습니다.
“이 응용 프로그램은 백그라운드 스레드에서 자동 레이아웃 엔진을 수정하여 엔진 손상 및 이상한 충돌로 이어질 수 있습니다. 이는 이후 릴리스에서 예외가 발생합니다.”
내 NSWindowcontentView
가 있고 창 을보기로 바꾸고 있습니다. 창에서 시도하고 할 때 또는 창에 a 를 추가 하면 오류가 발생 합니다. 자동 크기 조정 기능을 사용 중지하려고 시도했지만 자동 레이아웃을 사용하는 것이 없습니다. 이견있는 사람?NSApp.beginSheet
subview
때때로 그것은 괜찮고 아무 일도 일어나지 UI
않습니다.
답변
스레드 기능 실행이 완료되는 즉시 UI를 업데이트 할 수 있도록 다른 스레드 안에 배치해야합니다.
현대 스위프트 :
DispatchQueue.main.async {
// Update UI
}
이전 버전의 Swift, pre Swift 3
dispatch_async(dispatch_get_main_queue(){
// code here
})
목표 -C :
dispatch_async(dispatch_get_main_queue(), ^{
// code here
});
답변
‘dispatch_async’를 사용하지 않고 print 문으로 디버깅하는 동안 유사한 오류 메시지가 표시 되므로 해당 오류 메시지가 표시되면 사용 시간
스위프트 4
DispatchQueue.main.async { //code }
스위프트 3
DispatchQueue.main.async(){ //code }
이전 스위프트 버전
dispatch_async(dispatch_get_main_queue()){ //code }
답변
실제 문제가 발생한 후에도 “이 응용 프로그램은 백그라운드 스레드에서 자동 레이아웃 엔진을 수정하는 중”오류가 콘솔에 기록되므로 중단 점을 사용하지 않고 디버깅하는 것이 어려울 수 있습니다.
@markussvensson의 답변을 사용하여 문제를 감지 하고이 심볼릭 브레이크 포인트 (디버그> 브레이크 포인트> 심볼릭 브레이크 포인트 만들기)를 사용하여 문제를 발견했습니다 .
- 기호 :
[UIView layoutIfNeeded]
또는[UIView updateConstraintsIfNeeded]
- 질환:
!(BOOL)[NSThread isMainThread]
에뮬레이터에서 앱을 빌드하고 실행하고 오류 메시지가 표시되는 단계를 복제하십시오 (앱이 평소보다 느려집니다). 그런 다음 Xcode는 앱을 중지하고 백그라운드 스레드에서 UI에 액세스하는 코드 줄 (예 : func 호출)을 표시합니다.
답변
텍스트 필드 값을 업데이트하거나 백그라운드 스레드 내에 하위 뷰를 추가하려고하면이 문제가 발생할 수 있습니다. 따라서 이런 종류의 코드를 메인 스레드에 넣어야합니다.
기본 대기열을 가져 오려면 dispatch_asynch로 UI 업데이트를 호출하는 메서드를 래핑해야합니다. 예를 들면 다음과 같습니다.
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.friendLabel.text = "You are following \(friendCount) accounts"
})
편집-스위프트 3 :
이제 다음 코드에 따라이를 수행 할 수 있습니다.
// Move to a background thread to do some long running work
DispatchQueue.global(qos: .userInitiated).async {
// Do long running task here
// Bounce back to the main thread to update the UI
DispatchQueue.main.async {
self.friendLabel.text = "You are following \(friendCount) accounts"
}
}
답변
나에게이 오류 메시지는 Admob SDK의 배너에서 비롯된 것입니다.
조건부 중단 점을 설정하여 “WebThread”로 원점을 추적 할 수있었습니다.
그런 다음 배너 생성을 캡슐화하여 문제를 제거 할 수있었습니다.
dispatch_async(dispatch_get_main_queue(), ^{
_bannerForTableFooter = [[GADBannerView alloc] initWithAdSize:kGADAdSizeSmartBannerPortrait];
...
}
메인 코드가 아닌 스레드 에서이 코드가 어떻게 호출되는지 알 수 없으므로 이것이 왜 도움이되었는지 모르겠습니다.
그것이 누군가를 도울 수 있기를 바랍니다.
답변
NSURLConnection 비동기 요청 완료 처리기 내에서 UI 업데이트를 수행 한 블록을 호출 할 때 iOS 9 SDK로 업데이트 한 이후이 문제가 발생했습니다. dispatch_main_queue를 사용하여 블록 호출을 dispatch_async에 넣으면 문제가 해결되었습니다.
iOS 8에서 제대로 작동했습니다.
답변
내가 사용하고 있었기 때문에 같은 문제가있었습니다 performSelectorInBackground
.
