Ios &引用;此应用程序正在从后台线程“修改自动布局引擎”;

Ios &引用;此应用程序正在从后台线程“修改自动布局引擎”;,ios,swift,uitableview,uiimageview,Ios,Swift,Uitableview,Uiimageview,我有一个错误: 此应用程序正在从后台线程修改autolayout引擎,这可能导致引擎损坏和奇怪的崩溃 每当我尝试将图像视图加载到表视图中时。 有关守则如下: override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cellIdentifier = "ArticleCell" let cell =

我有一个错误:

此应用程序正在从后台线程修改autolayout引擎,这可能导致引擎损坏和奇怪的崩溃

每当我尝试将图像视图加载到表视图中时。 有关守则如下:

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\u get\u main\u队列代码,但它似乎对我没有多大帮助。

让我们确定导致自动布局引擎损坏的确切执行路径。为此,您需要将符号断点添加到以下内容:

+[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) 

完成此操作后,我们可以确定导致问题的确切位置。

能否在
表视图:cellforrowatinexpath:
中设置断点,然后从调用堆栈跟踪的位置检入堆栈跟踪?如果它位于后台线程上,您通常应该能够看到从哪里开始重新加载表。通过这种方式,您可以找到需要调度到主队列的位置…@Tirat2131当我试图重现类似的问题时,我得到了堆栈跟踪以及您消息中提到的问题。日志中是否有堆栈跟踪?如果有的话,你能提供这个吗?我怎么做?在我的情况下,仅仅
bt
是不够的。。。我必须检查
NSException
参数,以找出触发异常的元素:
po(char*)$arg6