xcode 从主线程访问后,不得从后台线程执行对 > 布局引擎的修改
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/58087536/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Modifications to the > layout engine must not be performed from a background thread after it has been accessed from the main thread
提问by Dani010
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:
我刚刚为我的 iPhone 和新的 Xcode 下载了 iOS 13。我想为 iOS 13 测试我的应用程序,但是当我尝试运行我的应用程序时,它会在几秒钟后给我一个错误。错误:
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
由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“从主线程访问布局引擎后,不得从后台线程执行对布局引擎的修改。” ***第一掷调用堆栈:(0x191ea9c30 0x191bc40c8 0x192395434 0x19218eb94 0x19218eaa8 0x19218e718 0x1963e6ea8 0x191bbfaf0 0x198984384 0x19634fe54 0x19898468c 0x198997bf4 0x1988dd3e4 0x1989083a0 0x198909388 0x191bbc3c0 0x191bb4dbc 0x191bb6de8 0x191bb6b30 0x191bbcc78)的libc ++ abi.dylib:与类型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?
在 iOS 12 及更低版本中,一切似乎都在工作,我不会收到此错误。有人知道如何修复此错误以及此错误的含义吗?
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
采纳答案by Paulw11
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
.
请注意,按照惯例,属性应以小写字母开头,而类应以大写字母开头。两者都应该使用camelCase,所以Top_Search
应该是topSearch
,Top_us
应该是TopUsers
,Indicator
应该是indicator
。
回答by Jan Schlorf
For anyone having problems pinning down the cause, try the following.
对于在确定原因时遇到问题的任何人,请尝试以下操作。
Click on your scheme (next to the stop button), then Edit Scheme.
单击您的方案(在停止按钮旁边),然后单击Edit Scheme。
Under Run-> Diagnosticsyou have to activate Main Thread Checker.
在Run-> Diagnostics 下,您必须激活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.
正如添加的断点所示,当您尝试更改非主线程上的 UI 时,您的执行现在将停止。
回答by Giang
You should wrap handling error by DispatchQueue.main.async{}
您应该通过以下方式包装处理错误 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()
}