设置委托Swift 4,iOS 10 +

时间:2017-09-25 12:40:38

标签: swift core-data nsfetchedresultscontroller nsmanagedobjectcontext

使用new:

使用backgroundContext将数据从HTTP请求插入到CoreData时,我遇到了一个非常奇怪的崩溃

persistentContainer.performBackgroundTask({(context)in })

我的代码如下:

persistentContainer.performBackgroundTask({ (context) in
   context.perform {
       //do some insert in this context (usually there is a lot of data)
       do {
          try context.save(). <-- Crash happens here
       } catch {
          //
       }
   }
})

我的FRC在主上下文中设置,以便为UITableView提供更新。如果在我的ViewController中我将FRC委托设置为self以便在tableView中进行UI更新,每次我刷新以获取新数据时都会崩溃(完全在上下文的保存中如上所示)。在线程堆栈中,顶行写着名:

CoreData`+[NSManagedObjectContext __Multithreading_Violation_AllThatIsLeftToUsIsHonor__]:

真正奇怪的是我在NSPersistentContainer的新API之前手动执行此操作,即创建私有队列上下文并监听其保存通知以通知主队列上下文并且它工作得很好。现在发生了这次事故。

此外,如果我在主队列上下文中插入请求中的数据,一切正常。如果我继续使用performBackgroundTask函数中的后台上下文但不在我的视图控制器中设置FRC的委托(因此,没有获得UI更新),这同样适用。

据我了解,这是一个非常简单的实现,以前按预期工作,但现在它没有,我开始相信我不能 - 再也 - 使用FRC与在Core中插入数据的API私有队列上下文中的数据堆栈。

你能建议另一种解决方案吗?感谢名单!

*如果我使用,也会发生同样的情况:

let context = CDManager.sharedInstance.container.newBackgroundContext()

**请求的响应在主队列中提供。

修改 我在另一个屏幕上为不同型号的另一个FRC设置完全相同,它工作得很好。我快要搞砸了......

更新 我评论了有问题的FRC的代码,重新写了它,它现在有效......真的很奇怪。但是,谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

摆脱&#39; context.perform&#39;。

上下文是临时的,可能不存在于performBackgroundTask块之外。 performBackgroundTask块已经在正确的线程上运行。当您调用context.perform时,上下文可能已经在代码运行时留下了内存。

这并不能解释为什么你会遇到fetch结果控制器的问题。我建议检查以确保所有内容都在主线程上,或者共享该代码。