Modifications to the > layout engine must not be performed from a background thread after it has been accessed from the main thread
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.
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.
Edit
When the breakpoint is not added. It can be added manually under:
Breakpoint Navigator -> + -> Runtime Issue Breakpoint -> Edit -> Type -> Main Thread Checker
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()
}
Dani010
Updated on January 25, 2022Comments
-
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 over 4 yearsThank you for you respone, but it doesn't seem to do the trick. I still got the same error!
-
Paulw11 over 4 yearsLooking 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 over 4 yearsdid you find the solution?
-
head in the codes over 3 yearsBy far the most useful answer here. Thank you, kind sir!
-
Skywalker about 3 yearsIf I could vote 5 more times I would.. Found out the issue because of this
-
Murat Akdeniz over 2 yearsmy problem was with only ios14 but this one fixed it. Thanks!
-
daniel over 2 yearsI followed these instructions, but the Breakpoint navigator does not show that breakpoint added. It doesn't show any breakpoints at all.
-
Simon McNeil over 2 yearsWow an absolute lifesaver answer
-
hordurh about 2 yearsThis answer is still saving lives in 2022
-
Abe about 2 yearsthanks, this steered me towards my React Native solution below
-
Jason almost 2 yearsThis worked for me, Xcode 13.3, Swift 5