此应用程序正在从后台线程修改自动布局引擎 - ios9

Posted

技术标签:

【中文标题】此应用程序正在从后台线程修改自动布局引擎 - ios9【英文标题】:This application is modifying the autolayout engine from a background thread - ios9 【发布时间】:2015-11-15 02:41:55 【问题描述】:
let url = NSURL(string: "http://api.mdec.club:3500/news?")

let task = NSURLSession.sharedSession().dataTaskWithURL(url!) 
    (data, response, error) in

    self.jsonResult = try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSMutableArray

    self.tableView.reloadData()


task.resume()

我不明白为什么会出现此错误。我必须将reloadData() 方法放在task 中,因为我必须等到获取数据。我如何才能重新加载表格视图而不会出现此错误?

【问题讨论】:

【参考方案1】:

我怎样才能在不出现此错误的情况下重新加载表格视图?

你为了调用reloadData而跳到主线程,像这样:

let task = NSURLSession.sharedSession().dataTaskWithURL(url!) 
    (data, response, error) in
    self.jsonResult = try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSMutableArray
    dispatch_async(dispatch_get_main_queue()) 
        self.tableView.reloadData()
    

总是在您从后台线程调用的代码中触摸界面时随时执行此操作。除了主线程之外,您永远永远永远永远不要触摸界面。

【讨论】:

实际上,在后台线程上修改self.jsonResult 也不是很明智,因此您可能希望将两行 行都放在dispatch_async 调用中。 它有效,谢谢!将在 4 分钟内接受答复。 ;) matt 你能解释一下为什么如果我把 jsonResult 放在调度中,我就知道为什么我正在做我正在做的事情 正确的做法是在后台进行反序列化,然后在重新加载之前在主队列上分配给self.jsonResult @nhgrif 很好,我没有把它逗得足够远

以上是关于此应用程序正在从后台线程修改自动布局引擎 - ios9的主要内容,如果未能解决你的问题,请参考以下文章

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

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

收到“此应用程序正在从后台线程修改自动布局引擎”错误?

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

在从主线程访问后,不得从后台线程对 > 布局引擎进行修改

从服务器下载:“此应用程序正在修改自动布局引擎......” [重复]