CoreData并发问题

时间:2016-06-02 09:11:00

标签: ios swift core-data concurrency nsmanagedobjectcontext

使用private managedObjectContext在后​​台保存数据时遇到问题。我是CoreData的新手。我正在使用{-1}}的亲子方法,但面临几个问题。

多次点击重新加载按钮时出现错误

错误:

  
      
  1. 'NSGenericException',原因:集合< __ NSCFSet:0x16e47100>在被枚举时被突变

  2.   
  3. 有时候:崩溃NSManagedObjectContext

  4.   
  5. 有时键值编码符合错误

  6.   

我的ViewController类

try managedObjectContext.save()

2 个答案:

答案 0 :(得分:3)

可以在后台写入并在主线程中读取(使用与您不同的MOC)。事实上,你几乎做得很好。

应用程序在try managedObjectContext.save()行崩溃,因为从私人MOC的performBlock中调用了saveMainContext。解决它的最简单方法是将保存操作包装到另一个performBlock

func saveMainContext () {
    managedObjectContext.performBlock {
        if managedObjectContext.hasChanges {
            do {
                try managedObjectContext.save()
            } catch {
                let nserror = error as NSError
                print("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }
}

其他两个错误更棘手。请提供更多信息。什么对象不符合关键值的键值?它很可能是JSON解析问题。

第一个错误("被枚举时变异")实际上是一个令人讨厌的错误。描述非常简单:一个集合在一个线程中被突变而另一个线程被枚举。它在哪里发生? 一个可能的原因(很可能是一个,我会说)是它确实是一个核心数据多线程问题。尽管您可以使用多个线程,但您只能在获取它们的线程中使用核心数据对象。如果你将它们传递给另一个线程,你可能会遇到这样的错误。

查看您的代码并尝试找到可能发生此类情况的地方(例如,您是否从其他类访问self.values?)。不幸的是,我几分钟内找不到这样的地方。如果你说哪个集合枚举发生了这个错误,那就会有帮助。)

<强>更新 附:我只是认为错误可能与saveMainContext函数有关。它在调用saved之前执行。 saveMainContext在后​​台线程上执行(在原始代码中,我的意思是),并且在主线程上执行saved。因此,在修复saveMainContext之后,错误可能会消失(尽管我不是100%肯定)。

答案 1 :(得分:-1)

你违反了线程限制。

您无法在后台写入CoreData,也无法在MainThread中读取。

CoreData上的所有操作必须在同一个线程中完成