Modifications to the > layout engine must not be performed from a background thread after it has been accessed from the main thread

50,429

Solution 1

Your network fetch code is almost right - you are reloading the table on the main queue but not stopping the activity indicator.

You just need to move that line inside the closure:

let downloadedData_user = try decoder.decode(Top_us.self, from: data)
    self.Top_Search = downloadedData_user.users
    DispatchQueue.main.async {
        self.tableView.reloadData()
        self.Indicator.stopAnimating()
    }

Note that by convention, properties should start with a lower case letter while classes should start with an upper case letter. Both should use camelCase, so Top_Search should be topSearch, Top_us should be TopUsers and Indicator should be indicator.

Solution 2

For anyone having problems pinning down the cause, try the following.

Click on your scheme (next to the stop button), then Edit Scheme.

Under Run -> Diagnostics you have to activate Main Thread Checker.

enter image description here

As indicated by the breakpoint that got added, your execution will now halt when you try to alter the UI on a non-main thread.

enter image description here

Edit

When the breakpoint is not added. It can be added manually under:

Breakpoint Navigator -> + -> Runtime Issue Breakpoint -> Edit -> Type -> Main Thread Checker

enter image description here

Solution 3

If anyone is having this issue while using UIAlertController like I was, try wrapping the entire alert into DispatchQueue.main.async like this:

DispatchQueue.main.async {
//alert:
    let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)
    let ok = UIAlertAction(title: "Ok", style: .cancel, handler: nil)
    alert.addAction(ok)
    self.present(alert, animated: true, completion: nil)
}

Solution 4

You should wrap handling error by DispatchQueue.main.async{}

func Download_ID() {
    let urlString = "https://www.instagram.com/\(self.username_String)/?__a=1"
    guard let url = URL(string: urlString) else { return }
    URLSession.shared.dataTask(with: url) { data, urlResponse, error in
        guard let data = data, error == nil, urlResponse != nil else {
            // Add DispatchQueue
            DispatchQueue.main.async {
              print(error)
            }
            return
        }
        do
        {
            let decoder = JSONDecoder()
            let downloadedData_user = try decoder.decode(Website.self, from: data)
            // your logic
            DispatchQueue.main.async {
               // update or reload table in here
            }
        } catch {
            // Add dispach_queue
            DispatchQueue.main.async {
              print(error)
            }
        }
    }.resume()
}
Share:
50,429
Dani010
Author by

Dani010

Updated on January 25, 2022

Comments

  • Dani010
    Dani010 over 2 years

    I just downloaded iOS 13 for my iPhone and the new Xcode. I wanted to test my app for iOS 13, but when I try to run my app it will give me a error after a few seconds. Error:

    Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Modifications to the layout engine must not be performed from a background thread after it has been accessed from the main thread.' *** First throw call stack: (0x191ea9c30 0x191bc40c8 0x192395434 0x19218eb94 0x19218eaa8 0x19218e718 0x1963e6ea8 0x191bbfaf0 0x198984384 0x19634fe54 0x19898468c 0x198997bf4 0x1988dd3e4 0x1989083a0 0x198909388 0x191bbc3c0 0x191bb4dbc 0x191bb6de8 0x191bb6b30 0x191bbcc78) libc++abi.dylib: terminating with uncaught exception of type NSException

    In iOS 12 and lower everything seems to be working and I won't get this error. Does somebody knows how to fix this error and what this error means?

    Download ID:

    func Download_ID() {
        let urlString = "https://www.instagram.com/\(self.username_String)/?__a=1"
        guard let url = URL(string: urlString) else { return }
        URLSession.shared.dataTask(with: url) { data, urlResponse, error in
            guard let data = data, error == nil, urlResponse != nil else {
                print(error)
                return
            }
            do
            {
                let decoder = JSONDecoder()
                let downloadedData_user = try decoder.decode(Website.self, from: data)
                DispatchQueue.main.async {
                    self.profile_img_String = downloadedData_user.graphql.user.profile_pic_url
                    let Veri = downloadedData_user.graphql.user.is_verified
                    if Veri == true {
                        self.Verified!.isHidden = false
                    }else{
                        self.Verified!.isHidden = true
    
                    }
                    self.Name!.text = downloadedData_user.graphql.user.full_name
                    self.username!.text = self.username_String
                    let url = URL(string: "\(self.profile_img_String)")
                    self.profileImage!.kf.indicatorType = .activity
                    self.profileImage!.kf.setImage(
                        with: url,
                        placeholder: UIImage(named: "image-placeholder.png"),
                        options: [
                            .scaleFactor(UIScreen.main.scale),
                            .transition(.fade(0.4)),
                            .cacheOriginalImage
                    ])
                }
            } catch {
                print(error)
            }
        }.resume()
    }
    

    Stack:

    Main Thread Checker: UI API called on a background thread: -[UIView setHidden:]
    PID: 4437, TID: 1560742, Thread name: (none), Queue name: NSOperationQueue 0x10440d330 (QOS: UNSPECIFIED), QoS: 0
    Backtrace:
    4   Instagram Profile                   0x00000001029c09bc $s17Instagram_Profile21History_TableViewCellC11Download_IDyyFyycfU_y10Foundation4DataVSg_So13NSURLResponseCSgs5Error_pSgtcfU_ + 1612
    5   Instagram Profile                   0x00000001029c10d4 $s10Foundation4DataVSgSo13NSURLResponseCSgs5Error_pSgIegggg_So6NSDataCSgAGSo7NSErrorCSgIeyByyy_TR + 284
    6   CFNetwork                           0x0000000195105ffc CFNetServiceBrowserSearchForServices + 95540
    7   CFNetwork                           0x00000001951168dc _CFHTTPMessageSetResponseProxyURL + 7680
    8   Foundation                          0x0000000192279c60 A99BF5C7-12EA-3700-8798-6522387A8A89 + 1170528
    9   Foundation                          0x000000019217b7e8 A99BF5C7-12EA-3700-8798-6522387A8A89 + 129000
    10  Foundation                          0x000000019227bfbc A99BF5C7-12EA-3700-8798-6522387A8A89 + 1179580
    11  Foundation                          0x000000019217b464 A99BF5C7-12EA-3700-8798-6522387A8A89 + 128100
    12  Foundation                          0x000000019227c9e8 A99BF5C7-12EA-3700-8798-6522387A8A89 + 1182184
    13  Foundation                          0x000000019227c4a8 A99BF5C7-12EA-3700-8798-6522387A8A89 + 1180840
    14  libdispatch.dylib                   0x00000001042bda48 _dispatch_block_async_invoke2 + 144
    15  libdispatch.dylib                   0x00000001042af2a8 _dispatch_client_callout + 20
    16  libdispatch.dylib                   0x00000001042b2084 _dispatch_continuation_pop + 572
    17  libdispatch.dylib                   0x00000001042b1468 _dispatch_async_redirect_invoke + 628
    18  libdispatch.dylib                   0x00000001042c0aac _dispatch_root_queue_drain + 356
    19  libdispatch.dylib                   0x00000001042c1418 _dispatch_worker_thread2 + 144
    20  libsystem_pthread.dylib             0x0000000191bb6a60 _pthread_wqthread + 216
    21  libsystem_pthread.dylib             0x0000000191bbcc78 start_wqthread + 8
    2019-09-24 23:21:24.917645+0200 Instagram Profile[4437:1560742] [reports] Main Thread Checker: UI API called on a background thread: -[UIView setHidden:]
    PID: 4437, TID: 1560742, Thread name: (none), Queue name: NSOperationQueue 0x10440d330 (QOS: UNSPECIFIED), QoS: 0
    Backtrace:
    4   Instagram Profile                   0x00000001029c09bc $s17Instagram_Profile21History_TableViewCellC11Download_IDyyFyycfU_y10Foundation4DataVSg_So13NSURLResponseCSgs5Error_pSgtcfU_ + 1612
    5   Instagram Profile                   0x00000001029c10d4 $s10Foundation4DataVSgSo13NSURLResponseCSgs5Error_pSgIegggg_So6NSDataCSgAGSo7NSErrorCSgIeyByyy_TR + 284
    6   CFNetwork                           0x0000000195105ffc CFNetServiceBrowserSearchForServices + 95540
    7   CFNetwork                           0x00000001951168dc _CFHTTPMessageSetResponseProxyURL + 7680
    8   Foundation                          0x0000000192279c60 A99BF5C7-12EA-3700-8798-6522387A8A89 + 1170528
    9   Foundation                          0x000000019217b7e8 A99BF5C7-12EA-3700-8798-6522387A8A89 + 129000
    10  Foundation                          0x000000019227bfbc A99BF5C7-12EA-3700-8798-6522387A8A89 + 1179580
    11  Foundation                          0x000000019217b464 A99BF5C7-12EA-3700-8798-6522387A8A89 + 128100
    12  Foundation                          0x000000019227c9e8 A99BF5C7-12EA-3700-8798-6522387A8A89 + 1182184
    13  Foundation                          0x000000019227c4a8 A99BF5C7-12EA-3700-8798-6522387A8A89 + 1180840
    14  libdispatch.dylib                   0x00000001042bda48 _dispatch_block_async_invoke2 + 144
    15  libdispatch.dylib                   0x00000001042af2a8 _dispatch_client_callout + 20
    16  libdispatch.dylib                   0x00000001042b2084 _dispatch_continuation_pop + 572
    17  libdispatch.dylib                   0x00000001042b1468 _dispatch_async_redirect_invoke + 628
    18  libdispatch.dylib                   0x00000001042c0aac _dispatch_root_queue_drain + 356
    19  libdispatch.dylib                   0x00000001042c1418 _dispatch_worker_thread2 + 144
    20  libsystem_pthread.dylib             0x0000000191bb6a60 _pthread_wqthread + 216
    21  libsystem_pthread.dylib             0x0000000191bbcc78 start_wqthread + 8
    2019-09-24 23:21:25.431565+0200 Instagram Profile[4437:1560883] WF: _userSettingsForUser mobile: {
        filterBlacklist =     (
        );
        filterWhitelist =     (
        );
        restrictWeb = 1;
        useContentFilter = 0;
        useContentFilterOverrides = 0;
        whitelistEnabled = 0;
    }
    2019-09-24 23:21:25.431612+0200 Instagram Profile[4437:1560883] WF: _WebFilterIsActive returning: NO
    2019-09-24 23:21:26.084697+0200 Instagram Profile[4437:1560883] WF: _userSettingsForUser mobile: {
        filterBlacklist =     (
        );
        filterWhitelist =     (
        );
        restrictWeb = 1;
        useContentFilter = 0;
        useContentFilterOverrides = 0;
        whitelistEnabled = 0;
    }
    2019-09-24 23:21:26.084745+0200 Instagram Profile[4437:1560883] WF: _WebFilterIsActive returning: NO
    2019-09-24 23:21:26.150637+0200 Instagram Profile[4437:1560979] NSURLConnection ordering violation: didFinishLoading to be scheduled before didReceiveResponse
    2019-09-24 23:21:30.905067+0200 Instagram Profile[4437:1560742] 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                          0x00000001923953a4 A99BF5C7-12EA-3700-8798-6522387A8A89 + 2331556
        1   Foundation                          0x000000019218eb94 A99BF5C7-12EA-3700-8798-6522387A8A89 + 207764
        2   Foundation                          0x000000019218eaa8 A99BF5C7-12EA-3700-8798-6522387A8A89 + 207528
        3   Foundation                          0x000000019218e718 A99BF5C7-12EA-3700-8798-6522387A8A89 + 206616
        4   UIKitCore                           0x00000001963e6ea8 EBED47E6-6BB2-3119-82CE-CC13EDCA02D6 + 15568552
        5   libobjc.A.dylib                     0x0000000191bbfaf0 10328337-A06E-370F-8958-6EDDA1F434DC + 6896
        6   QuartzCore                          0x0000000198984384 18D85F6F-635D-3A6F-BF7D-898A644FDCF5 + 1393540
        7   UIKitCore                           0x000000019634fe54 EBED47E6-6BB2-3119-82CE-CC13EDCA02D6 + 14949972
        8   QuartzCore                          0x000000019898468c 18D85F6F-635D-3A6F-BF7D-898A644FDCF5 + 1394316
        9   QuartzCore                          0x0000000198997bf4 18D85F6F-635D-3A6F-BF7D-898A644FDCF5 + 1473524
        10  QuartzCore                          0x00000001988dd3e4 18D85F6F-635D-3A6F-BF7D-898A644FDCF5 + 709604
        11  QuartzCore                          0x00000001989083a0 18D85F6F-635D-3A6F-BF7D-898A644FDCF5 + 885664
        12  QuartzCore                          0x0000000198909388 18D85F6F-635D-3A6F-BF7D-898A644FDCF5 + 889736
        13  libsystem_pthread.dylib             0x0000000191bbc3c0 FEB52688-4D65-3D38-AD50-01B128A74208 + 37824
        14  libsystem_pthread.dylib             0x0000000191bb4dbc FEB52688-4D65-3D38-AD50-01B128A74208 + 7612
        15  libsystem_pthread.dylib             0x0000000191bb6de8 FEB52688-4D65-3D38-AD50-01B128A74208 + 15848
        16  libsystem_pthread.dylib             0x0000000191bb6b30 _pthread_wqthread + 424
        17  libsystem_pthread.dylib             0x0000000191bbcc78 start_wqthread + 8
    )
    2019-09-24 23:21:30.927369+0200 Instagram Profile[4437:1560742] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Modifications to the layout engine must not be performed from a background thread after it has been accessed from the main thread.'
    *** First throw call stack:
    (0x191ea9c30 0x191bc40c8 0x192395434 0x19218eb94 0x19218eaa8 0x19218e718 0x1963e6ea8 0x191bbfaf0 0x198984384 0x19634fe54 0x19898468c 0x198997bf4 0x1988dd3e4 0x1989083a0 0x198909388 0x191bbc3c0 0x191bb4dbc 0x191bb6de8 0x191bb6b30 0x191bbcc78)
    libc++abi.dylib: terminating with uncaught exception of type NSException
    
  • Dani010
    Dani010 over 4 years
    Thank you for you respone, but it doesn't seem to do the trick. I still got the same error!
  • Paulw11
    Paulw11 over 4 years
    Looking more closely at the stack trace, you are performing a network operation in Download_ID in your table view cell - This is also updating the UI from a background queue.
  • Ruchi
    Ruchi over 4 years
    did you find the solution?
  • head in the codes
    head in the codes over 3 years
    By far the most useful answer here. Thank you, kind sir!
  • Skywalker
    Skywalker about 3 years
    If I could vote 5 more times I would.. Found out the issue because of this
  • Murat Akdeniz
    Murat Akdeniz over 2 years
    my problem was with only ios14 but this one fixed it. Thanks!
  • daniel
    daniel over 2 years
    I followed these instructions, but the Breakpoint navigator does not show that breakpoint added. It doesn't show any breakpoints at all.
  • Simon McNeil
    Simon McNeil over 2 years
    Wow an absolute lifesaver answer
  • hordurh
    hordurh about 2 years
    This answer is still saving lives in 2022
  • Abe
    Abe about 2 years
    thanks, this steered me towards my React Native solution below
  • Jason
    Jason almost 2 years
    This worked for me, Xcode 13.3, Swift 5