44
votes

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
4
Look at the stacktrace in Xcode and see where you are causing layout updates from a background thread.rmaddy
I can't seem to figure it out, can you help me where I can find update from a background thread in the stacktrace?Dani010
From the looks of the stack trace you are fetching some Instagram profile data from the network; make sure that the completion handler for this code dispatches back to the main queue before updating the UiPaulw11
@Paulw11 Thanks for your relpy! I am not sure what I need to do how to fix it. I have added my funtion that fetches data from instagram.Dani010
Facing the same issue.. iOS 12 is working fine ... iOS 13 I'm facing the issueYalamandarao

4 Answers

49
votes

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.

34
votes

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

5
votes

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()
}
2
votes

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)
}