无休止地保存核心数据上下文

时间:2010-05-29 15:13:49

标签: sqlite core-data

有时我注意到一个'save:'操作,ManagedObjectContext永远不会返回并消耗100%的CPU。

我在GarbageCollected环境中使用SQL Store(Mac OS X 10.6.3)。磁盘活动显示大约700 KB / s的写入速度。在查看包含sqlite数据库文件的文件夹时,“-journal”文件出现并消失,出现并消失,...

这是过程分析的调用图的一部分:

  2203 -[NSManagedObjectContext save:]
    1899 -[NSPersistentStoreCoordinator(_NSInternalMethods) executeRequest:withContext:]
      1836 -[NSSQLCore executeRequest:withContext:]
        1836 -[NSSQLCore saveChanges:]
          1479 -[NSSQLCore performChanges]
            ...
          335 -[NSSQLCore recordChangesInContext:]
            ...
          20 -[NSSQLCore rollbackChanges]
            ...
          2 -[NSSQLCore prepareForSave:]
            ...
      62 -[NSPersistentStoreCoordinator(_NSInternalMethods) _checkRequestForStore:originalRequest:andOptimisticLocking:]
        ...
      1 -[NSPersistentStore(_NSInternalMethods) _preflightCrossCheck]
        ...
    184 -[NSMergePolicy resolveConflicts:]
      ...
    120 -[NSManagedObjectContext(_NSInternalChangeProcessing) _prepareForPushChanges:]
      ...

主GUI线程中发生的一切。

我有什么想法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

感谢Marcus的暗示,这是一个循环!但是这个循环不是由观察者引起的。

循环的原因是CoreData中的一个错误(我认为它是一个):在这种情况下保存的实体之一具有类型Double的属性。而物业价值也发生了变化。因此,CoreData将存储的值与缓存的值进行比较,有时十进制数字会使CoreData NSSQLCore“认为”存储的值从外部发生了变化。

通常这会导致save:方法失败并返回NSError但在我的情况下配置NSManagedObjectContext以使用NSMergeByPropertyObjectTrumpMergePolicy合并策略。因此,由于CoreData错误地认为存在外部更改,它只需要内存中的属性值(具有一些“不利”数字)并存储它。之后,它将存储的值与内存中的值进行比较,并再次检测不等式并执行回滚并再次存储该值 - 这就是循环。

由于我强制Double属性存储包含整数值的NSNumber个对象,因此save:成功。

此链接link text帮助我找到答案。

我不是CoreData专家,所以我不确定是否所有内容都已正确解释。

答案 1 :(得分:0)

显然,你很可能有一个循环。您是否正在监控NSNotification正在广播的NSManagedObjectContext?这通常是导致像这样的循环的唯一因素。

您使用的是任何线程吗?

更新

关闭保存的观察者,看看循环是否仍然存在。没有看到你的代码是关于循环原因的最佳猜测。