programing

"이 응용 프로그램은 백그라운드 스레드에서 자동 레이아웃 엔진을 수정하고 있습니다" 오류가 표시됩니까?

mbctv 2023. 4. 21. 21:19
반응형

"이 응용 프로그램은 백그라운드 스레드에서 자동 레이아웃 엔진을 수정하고 있습니다" 오류가 표시됩니까?

swift를 사용하여 OS X에서 이 오류가 자주 발생하고 있습니다.

"이 애플리케이션은 백그라운드 스레드에서 자동 레이아웃 엔진을 수정하고 있으며, 이로 인해 엔진이 파손되거나 이상한 충돌이 발생할 수 있습니다.이로 인해 향후 출시에서 예외가 발생할 수 있습니다.

NSWindow가 있고 뷰에서contentView창문에 붙어있어요.에러는, 이 에러입니다.NSApp.beginSheet ""를할 때 " " " "를 추가합니다.subview★★★★★ 크기 조정 을 무효로 해 자동 레이아웃을 사용한 .자동 크기 조정 기능을 해제하려고 했지만 자동 레이아웃을 사용할 수 있는 기능이 없습니다.슨슨생 슨??

않을 때도 있고, 때도 있다.UI도 로드하지 않는다

스레드 기능 실행이 완료되는 즉시 UI를 업데이트할 수 있도록 다른 스레드 내에 배치해야 합니다.

모던 스위프트:

DispatchQueue.main.async {
    // Update UI
}

스위프트의 이전 버전, 스위프트 3 이전 버전입니다.

dispatch_async(dispatch_get_main_queue(){
    // code here
})

목표-C:

dispatch_async(dispatch_get_main_queue(), ^{
    // code here
});

'dispatch_async'를 사용하지 않고 인쇄문을 사용하여 디버깅할 때 유사한 오류 메시지가 나타납니다.따라서 이 오류 메시지가 뜨면 사용할 시간입니다.

스위프트 4

DispatchQueue.main.async { //code }

스위프트 3

DispatchQueue.main.async(){ //code }

이전 Swift 버전

dispatch_async(dispatch_get_main_queue()){ //code }

실제 문제가 발생한 후 한참 후에 콘솔에 "이 응용 프로그램은 백그라운드 스레드에서 자동 레이아웃 엔진을 수정하고 있습니다." 오류가 기록되므로 중단점을 사용하지 않으면 디버깅이 어려울 수 있습니다.

문제를 검출하기 위해 @markussvenson의 답변을 사용하고 다음 심볼릭 브레이크포인트([Debug]> [ Breakpoints ]> [ Create Symbolic Breakpoint ])를 사용하여 문제를 검출했습니다.

  1. 호::[UIView layoutIfNeeded] ★★★★★★★★★★★★★★★★★」[UIView updateConstraintsIfNeeded]
  2. : 태 :!(BOOL)[NSThread isMainThread]

여기에 이미지 설명 입력

에뮬레이터에서 앱을 빌드하여 실행하고 에러 메시지가 뜨는 단계를 복제합니다(앱이 평소보다 느려집니다!).그런 다음 Xcode는 앱을 중지하고 백그라운드 스레드에서 UI에 액세스하는 코드 줄(예: 펑크 호출)을 표시합니다.

텍스트 필드 값을 업데이트하거나 백그라운드 스레드 내에 하위 보기를 추가할 때 이 문제가 발생할 수 있습니다.따라서 이러한 코드를 메인 스레드에 삽입해야 합니다.

메인 큐를 가져오려면 UI 업데이트를 dispatch_asynch로 호출하는 메서드를 랩해야 합니다.예를 들어 다음과 같습니다.

dispatch_async(dispatch_get_main_queue(), { () -> Void in
   self.friendLabel.text = "You are following \(friendCount) accounts"
})

편집 - SWIFT 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 의 배너로부터 발신되었습니다.

조건부 브레이크 포인트를 설정해, 「Web Thread」의 원점을 추적할 수 있었습니다.

백그라운드 스레드에서 UI를 업데이트하는 사용자를 찾기 위한 조건부 중단점

다음으로 Banner 작성을 캡슐화함으로써 문제를 해결할 수 있었습니다.

dispatch_async(dispatch_get_main_queue(), ^{
   _bannerForTableFooter = [[GADBannerView alloc] initWithAdSize:kGADAdSizeSmartBannerPortrait];
   ...
}

비메인 스레드에서 이 코드가 어떻게 호출되었는지 알 수 없기 때문에 왜 도움이 되었는지 모르겠습니다.

도움이 됐으면 좋겠어요.

NSURLConnection 비동기 요청 완료 핸들러 내에서 UI 업데이트를 하는 블록을 호출할 때 iOS 9 SDK로 업데이트한 후 이 문제가 발생했습니다.dispatch_main_queue를 사용하여 블록콜을 dispatch_async에 넣으면 문제가 해결되었습니다.

iOS 8에서는 정상적으로 동작했습니다.

같은 가 생겼어요.performSelectorInBackground.

「이 애플리케이션은 백그라운드 스레드에서 자동 레이아웃 엔진을 수정하고 있습니다」의 주된 문제는, 실제의 문제가 발생하고 나서 오랜 시간이 경과한 후에 로그에 기록되는 것처럼 보여 트러블 슈팅이 매우 어려워질 가능성이 있습니다.

나는 세 가지의 상징적인 중단점을 만들어 문제를 해결했다.

[ Debug ]> [ Breakpoints ]> [ Create Symbolic Breakpoint ...

중단점 1:

  • 호::-[UIView setNeedsLayout]

  • : 태 :!(BOOL)[NSThread isMainThread]

중단점 2:

  • 호::-[UIView layoutIfNeeded]

  • : 태 :!(BOOL)[NSThread isMainThread]

브레이크 포인트 3:

  • 호::-[UIView updateConstraintsIfNeeded]

  • : 태 :!(BOOL)[NSThread isMainThread]

이러한 중단점을 사용하면 메인 스레드 이외의 UI 메서드를 잘못 호출한 실제 회선을 쉽게 끊을 수 있습니다.

UI를 메인 스레드 외부에서 변경하지 마십시오!UIKit은 스레드 세이프가 아니기 때문에 위의 문제나 다른 이상한 문제가 발생할 수 있습니다.이 앱은 크래시 될 수도 있다.

따라서 UIKit 작업을 수행하려면 블록을 정의하고 다음과 같이 메인 큐에서 실행할 수 있도록 해야 합니다.

NSOperationQueue.mainQueue().addOperationWithBlock {

}

백그라운드 스레드에서 UI 업데이트를 하고 있는 것이 분명합니다.코드를 보지 않고 정확히 위치를 예측할 수 없습니다.

다음과 같은 상황이 발생할 수 있습니다.

사용하지 않고 백그라운드 스레드로 무언가를 하고 있을 수 있습니다.이 코드는 같은 기능에 있기 때문에 발견하기 쉬워집니다.

DispatchQueue.main.async { // do UI update here }

백그라운드 스레드에서 웹 요청 호출을 하는 펑크 호출과 UI 업데이트를 하는 다른 펑크 호출 완료 핸들러 호출.이 문제를 해결하려면 웹 요청 호출 후 UI를 업데이트한 코드를 확인하십시오.

// Do something on background thread
DispatchQueue.global(qos: .userInitiated).async {
   // update UI on main thread
   DispatchQueue.main.async {
                // Updating whole table view
                self.myTableview.reloadData()
            }
}

UITableView에서 데이터를 새로고침 할 때 이 문제가 발생하였습니다.아래와 같이 새로고침만 하면 문제가 해결됩니다.

    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        self.tableView.reloadData()
    })

저도 같은 문제가 있었어요.알고보니 내가 쓰고 있던 건UIAlerts메인 큐가 필요했어요하지만, 그들은 추천을 받지 못했다.
변경했을 때UIAlerts에게UIAlertController, 나는 더 이상 문제를 가지고 있지 않았고 어떤 것도 사용할 필요가 없었다.dispatch_async코드. 교훈 - 경고에 주의를 기울이십시오.예상치 못한 상황에서도 도움이 됩니다.

이미 @Mark에서 올바른 코드 답변을 받았습니다만, 저의 조사 결과를 공유하기 위해:문제는 뷰의 변경을 요구하고 있으며, 즉시 변경이 이루어질 것으로 상정하고 있다는 것입니다.실제로 뷰의 로드는 사용 가능한 리소스에 따라 달라집니다.모든 것이 충분히 빠르게 로딩되고 지연이 없다면 아무것도 눈치채지 못할 것입니다.프로세스 스레드가 비지 상태 등으로 인해 지연이 발생하는 시나리오에서는 어플리케이션은 아직 준비되지 않은 상태에서도 표시되어야 하는 상황에 처합니다.따라서 이러한 요구는 부하에 따라 실행되도록 비동기 큐에 디스패치하는 것이 좋습니다.

Touch를 사용할 때 이 문제가 발생했습니다.다른 사람에게 도움이 될 경우 메인 큐에 있는 UI를 사용하여 작업을 수행할 수 있는 성공 로직을 정리합니다.

텍스트 필드/라벨 값을 설정하거나 백그라운드 스레드 내에 하위 보기를 추가하는 등의 간단한 방법으로 필드의 레이아웃을 변경할 수 있습니다.인터페이스에서 수행하는 모든 작업은 메인 스레드에서만 수행되도록 하십시오.

다음 링크를 확인합니다.https://forums.developer.apple.com/thread/7399

같은 View Controller의 UILabel에서 오류 메시지를 업데이트하려고 할 때 같은 문제가 발생했습니다(일반 코딩으로 업데이트하려고 할 때 데이터 업데이트에 시간이 걸립니다).나는 사용했다DispatchQueueSwift 3 Xcode 8에서 동작합니다.

이 오류를 헌트하려면 메인 스레드체커 일시정지 체크박스를 사용합니다.대부분의 경우 메인 큐에 문제가 있는 회선을 디스패치하여 쉽게 수정할 수 있습니다.

여기에 이미지 설명 입력

저에게 있어서 문제는 다음과 같습니다.확인하다performSegueWithIdentifier:는 메인 스레드에서 수행됩니다.

dispatch_async (dispatch_get_main_queue(), ^{
  [self performSegueWithIdentifier:@"ViewController" sender:nil];
});

스위프트 4,

조작 큐를 사용하여 어떤 메서드를 호출한다고 가정합니다.

operationQueue.addOperation({
            self.searchFavourites()
        })

함수 searchFavorites는 다음과 같습니다.

func searchFavourites() {
     DispatchQueue.main.async {
                    //Your code
                }
}

메인 스레드의 메서드 "searchFavorites"에 있는 모든 코드를 호출하면 해당 메서드에서 UI를 업데이트하면 오류가 발생합니다.

이 응용 프로그램은 메인 스레드에서 엔진에 액세스한 후 백그라운드 스레드에서 자동 레이아웃 엔진을 수정합니다.

해결책을 사용하세요.

operationQueue.addOperation({
            DispatchQueue.main.async {
                self.searchFavourites()
            }
        })

이런 시나리오에서는요.

로그에서 이 행을 확인합니다.

$S12AppName18ViewControllerC11Func()ySS_S2StF + 4420

background 스레드에서 호출하는 함수와 api 메서드에서 호출하는 함수가 무엇인지 확인할 수 있습니다.

DispatchQueue.main.async { func()}

func()는 api 호출의 성공 또는 그 외의 결과로 호출하는 함수입니다.

여기에 로그

This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.
 Stack:(
    0   Foundation                          0x00000001c570ce50 <redacted> + 96
    1   Foundation                          0x00000001c5501868 <redacted> + 32
    2   Foundation                          0x00000001c5544370 <redacted> + 540
    3   Foundation                          0x00000001c5543840 <redacted> + 396
    4   Foundation                          0x00000001c554358c <redacted> + 272
    5   Foundation                          0x00000001c5542e10 <redacted> + 264
    6   UIKitCore                           0x00000001f20d62e4 <redacted> + 488
    7   UIKitCore                           0x00000001f20d67b0 <redacted> + 36
    8   UIKitCore                           0x00000001f20d6eb0 <redacted> + 84
    9   Foundation                          0x00000001c571d124 <redacted> + 76
    10  Foundation                          0x00000001c54ff30c <redacted> + 108
    11  Foundation                          0x00000001c54fe304 <redacted> + 328
    12  UIKitCore                           0x00000001f151dc0c <redacted> + 156
    13  UIKitCore                           0x00000001f151e0c0 <redacted> + 152
    14  UIKitCore                           0x00000001f1514834 <redacted> + 868
    15  UIKitCore                           0x00000001f1518760 <redacted> + 104
    16  UIKitCore                           0x00000001f1543370 <redacted> + 1772
    17  UIKitCore                           0x00000001f1546598 <redacted> + 120
    18  UIKitCore                           0x00000001f14fc850 <redacted> + 1452
    19  UIKitCore                           0x00000001f168f318 <redacted> + 196
    20  UIKitCore                           0x00000001f168d330 <redacted> + 144
    21  AppName                        0x0000000100b8ed00 $S12AppName18ViewControllerC11Func()ySS_S2StF + 4420
    22  AppName                        0x0000000100b8d9f4 $S12CcfU0_y10Foundation4DataVSg_So13NSURLResponseCSgs5Error_pSgtcfU_ + 2384
    23  App NAme                        0x0000000100a98f3c $S10Foundation4DataVSgSo13NSURLResponseCSgs5Error_pSgIegggg_So6NSDataCSgAGSo7NSErrorCSgIeyByyy_TR + 316
    24  CFNetwork                           0x00000001c513aa00 <redacted> + 32
    25  CFNetwork                           0x00000001c514f1a0 <redacted> + 176
    26  Foundation                          0x00000001c55ed8bc <redacted> + 16
    27  Foundation                          0x00000001c54f5ab8 <redacted> + 72
    28  Foundation                          0x00000001c54f4f8c <redacted> + 740
    29  Foundation                          0x00000001c55ef790 <redacted> + 272
    30  libdispatch.dylib                   0x000000010286f824 _dispatch_call_block_and_release + 24
    31  libdispatch.dylib                   0x0000000102870dc8 _dispatch_client_callout + 16
    32  libdispatch.dylib                   0x00000001028741c4 _dispatch_continuation_pop + 528
    33  libdispatch.dylib                   0x0000000102873604 _dispatch_async_redirect_invoke + 632
    34  libdispatch.dylib                   0x00000001028821dc _dispatch_root_queue_drain + 376
    35  libdispatch.dylib                   0x0000000102882bc8 _dispatch_worker_thread2 + 156
    36  libsystem_pthread.dylib             0x00000001c477917c _pthread_wqthread + 472
    37  libsystem_pthread.dylib             0x00000001c477bcec start_wqthread + 4
)

또한 이 문제가 발생했습니다.창의 크기를 초기값보다 작게 했을 때 출력에 이러한 메시지와 스택트레이스가 많이 출력되어 있습니다.오랜 시간을 들여 문제를 파악한 결과, 저는 다소 간단한 해결책을 공유해야겠다고 생각했습니다.에 한한 i i i i i i i i i i i i i i i i i를 활성화한 적이 있습니다.Can Draw Concurrently NSTextView 뷰의 AppKit할 수 .draw(_:)하다비활성화 후 오류 메시지가 표시되지 않게 되었습니다.MacOS 10.14 Beta로 업데이트하기 전에는 문제가 없었지만, 동시에 텍스트 뷰에서 작업하기 위해 코드를 수정하기 시작했습니다.

언급URL : https://stackoverflow.com/questions/28302019/getting-a-this-application-is-modifying-the-autolayout-engine-from-a-background

반응형