有时我注意到一个'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线程中发生的一切。
我有什么想法可以解决这个问题吗?
答案 0 :(得分:3)
感谢Marcus的暗示,这是一个循环!但是这个循环不是由观察者引起的。
循环的原因是CoreData中的一个错误(我认为它是一个):在这种情况下保存的实体之一具有类型Double
的属性。而物业价值也发生了变化。因此,CoreData将存储的值与缓存的值进行比较,有时十进制数字会使CoreData NSSQLCore
“认为”存储的值从外部发生了变化。
通常这会导致save:
方法失败并返回NSError
但在我的情况下配置NSManagedObjectContext
以使用NSMergeByPropertyObjectTrumpMergePolicy
合并策略。因此,由于CoreData错误地认为存在外部更改,它只需要内存中的属性值(具有一些“不利”数字)并存储它。之后,它将存储的值与内存中的值进行比较,并再次检测不等式并执行回滚并再次存储该值 - 这就是循环。
由于我强制Double
属性存储包含整数值的NSNumber
个对象,因此save:
成功。
此链接link text帮助我找到答案。
我不是CoreData
专家,所以我不确定是否所有内容都已正确解释。
答案 1 :(得分:0)
显然,你很可能有一个循环。您是否正在监控NSNotification
正在广播的NSManagedObjectContext
?这通常是导致像这样的循环的唯一因素。
您使用的是任何线程吗?
关闭保存的观察者,看看循环是否仍然存在。没有看到你的代码是关于循环原因的最佳猜测。