0

使用从HTTP请求中插入数据时成CoreData与backgroundContext我有一个很奇怪的碰撞新:NSFetchedResultController崩溃设定时代表夫特4,的iOS 10+

persistentContainer.performBackgroundTask({(上下文)中 })

我的代码如下:

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更新),这同样适用。

据我所知,这是一个非常简单的实现,以前按预期工作,但现在它并没有,我开始相信我不能 - 现在已经不能 - 使用带有插入数据的API的FRC核心数据堆栈在专用队列上下文中。

你能否提出另一种解决方案?感谢名单!

*同样的情况,如果我使用:

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

**请求的响应担任主队列。

编辑 我在另一个屏幕上为另一个FRC另一个屏幕完全相同的设置为一个不同的模型,它工作得很好。我对破解我的头......

UPDATE 我评论的问题FRC的代码,重新写它和它的作品现在......真的很奇怪。不过,谢谢你的帮助!

回答

0

摆脱'context.perform'。

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

这并不能解释为什么你会对提取结果控制器有问题。我会建议检查以确保一切都在主线程上,或者共享该代码。

+0

我已经删除了context.perform ...我已经检查了一切... – nick3389

+0

另外,我试图手动将背景上下文中的记录插入FRC查找和发生的实体。 – nick3389