“此应用程序正在从后台线程修改自动布局引擎”
Posted
技术标签:
【中文标题】“此应用程序正在从后台线程修改自动布局引擎”【英文标题】:"This application is modifying the autolayout engine from a background thread" 【发布时间】:2016-04-20 11:10:03 【问题描述】:我有一个错误:
此应用程序正在从后台线程修改自动布局引擎,这可能导致引擎损坏和奇怪的崩溃
每当我尝试将图像视图加载到表格视图中时。 相关代码如下:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cellIdentifier = "ArticleCell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! ArticleCell
let a: Article = self.articlesArray[indexPath.row] as! Article
//let a: Article = self.newArticlesArray[indexPath.row] as! Article
cell.titleLabel.text = a.title
cell.descLabel.text = a.desc
let data = NSData(contentsOfURL: a.thumbnail)
cell.iView.image = UIImage(data: data!)
return cell
func downloadArticles()
//JSON parsing methods here
self.syncCompleted = true
dispatch_async(dispatch_get_main_queue())
self.tableView.reloadData()
task.resume()
每次我在表格视图中单击图像时,图像都会移动到单元格的左侧,如果我加载的图像不是 UIImageView 的大小,那么它会全部调整大小。
我该如何解决这个错误?
我已经尝试了 dispatch_get_main_queue 代码,但它似乎对我没有多大作用。
【问题讨论】:
你能在你的tableView:cellForRowAtIndexPath:
中设置一个断点,然后从调用它的地方检查堆栈跟踪吗?如果它在后台线程上,您通常应该能够看到表重新加载的来源。通过这种方式,您可以发现需要分派到主队列的位置...
@Tirat2131 当我尝试重现类似问题时,我得到了 Stack trace 以及您提到的消息。您是否在日志中获取堆栈跟踪?有的话可以提供吗?
我该怎么做?
【参考方案1】:
让我们确定导致自动布局引擎损坏的确切执行路径。为此,您需要将符号断点添加到以下内容:
+[NSException raise:format:]
你可以这样做:
然后:
之后,一旦您的应用卡在断点上,请抓取并共享堆栈跟踪。您可以使用 lldb 控制台执行此操作:
(lldb) bt
* thread #4: tid = 0x2bbc48, 0x000000010ba5ebf0 CoreFoundation`+[NSException raise:format:], queue = 'com.apple.root.default-qos', stop reason = breakpoint 1.1
* frame #0: 0x000000010ba5ebf0 CoreFoundation`+[NSException raise:format:]
frame #1: 0x0000000108dd5b6b Foundation`_AssertAutolayoutOnMainThreadOnly + 79
frame #2: 0x0000000108dd5a62 Foundation`-[NSISEngine _optimizeWithoutRebuilding] + 49
frame #3: 0x0000000108c34c0f Foundation`-[NSISEngine optimize] + 46
frame #4: 0x0000000108c3b875 Foundation`-[NSISEngine constraintDidChangeSuchThatMarker:shouldBeReplacedByMarkerPlusDelta:] + 313
frame #5: 0x0000000108c3b6f2 Foundation`-[NSISEngine tryToChangeConstraintSuchThatMarker:isReplacedByMarkerPlusDelta:undoHandler:] + 440
frame #6: 0x0000000108c27715 Foundation`-[NSLayoutConstraint _tryToChangeContainerGeometryWithUndoHandler:] + 484
frame #7: 0x0000000108c27274 Foundation`-[NSLayoutConstraint _setSymbolicConstant:constant:] + 422
frame #8: 0x0000000108ac35d5 iosapp`ViewController.(self=0x00007fe86a6abc80) -> ()).(closure #1) + 133 at ViewController.swift:26
frame #9: 0x0000000108ac3627 iosapp`thunk + 39 at ViewController.swift:0
frame #10: 0x000000010c775d9d libdispatch.dylib`_dispatch_call_block_and_release + 12
frame #11: 0x000000010c7963eb libdispatch.dylib`_dispatch_client_callout + 8
frame #12: 0x000000010c77eb2f libdispatch.dylib`_dispatch_root_queue_drain + 1829
frame #13: 0x000000010c77e405 libdispatch.dylib`_dispatch_worker_thread3 + 111
frame #14: 0x000000010cad34de libsystem_pthread.dylib`_pthread_wqthread + 1129
frame #15: 0x000000010cad1341 libsystem_pthread.dylib`start_wqthread + 13
(lldb)
完成此操作后,我们可以确定导致问题的确切位置。
【讨论】:
就我而言,仅仅bt
是不够的...我必须检查NSException
参数以找出触发异常的元素:po (char *)$arg6
以上是关于“此应用程序正在从后台线程修改自动布局引擎”的主要内容,如果未能解决你的问题,请参考以下文章
Xcode7:此应用程序正在从后台线程修改自动布局引擎,这可能导致引擎损坏和奇怪的崩溃
iOS 9 键盘:此应用程序正在从后台线程修改自动布局引擎,这可能导致引擎损坏和奇怪的崩溃