我的CoreData应用程序经常在我的调试控制台中记录此错误:
2018-11-24 19:47:12.516168+0100 SGI Phone[71132:13177420] [error] fault: NULL _cd_rawData but the object is not being turned into a fault
CoreData: fault: NULL _cd_rawData but the object is not being turned into a fault
但是,不是崩溃。该应用程序愉快地继续。显然,没有造成伤害。
还是,我很担心。我发现的所有对此消息的引用都是关于崩溃的。
此外,我检查了所有返回NSError
的呼叫,但没有一个失败。
此外,我发现的所有引用都说NSManagedContext
在其线程外使用时会发生。但是,我已经启用了-com.apple.CoreData.ConcurrencyDebug 1
调试标志,并且从未触发过它。
我的应用程序很大,我不知所措,我可以在此处发布什么代码段来帮助缩小问题的范围。
FWIW,我使用了一个现代的Core Data堆栈,其中包含NSPersistentContainer
,两个NSManagedContext
:主要的viewContext
和在启动时分配的单个背景上下文。
我使用默认的“错误”合并策略,当我在收到通知时合并两个上下文更改时,它永远不会触发错误。
有人知道如何在Core Data输出此错误消息时设置断点吗? 还有其他想法吗? 我应该发布什么代码,因为在发生这种情况时我还无法识别(可)重现的情况?
编辑1:仅当我将此代码插入我的NSManagedObject
核心数据类之一时,这种情况才会发生:
static void * KVOprogressStateContext = &KVOprogressStateContext;
- (void)awakeFromFetch
{
[super awakeFromFetch];
[self addObserver:self forKeyPath:@"report.progressState" options:(NSKeyValueObservingOptions)(NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew) context:KVOprogressStateContext];
}
- (void)awakeFromInsert
{
[super awakeFromInsert];
[self addObserver:self forKeyPath:@"report.progressState" options:(NSKeyValueObservingOptions)(NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew) context:KVOprogressStateContext];
}
- (void)didTurnIntoFault
{
[self removeObserver:self forKeyPath:@"report.progressState"];
[super didTurnIntoFault];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
}
错误消息总是在调用observeValueForKeyPath:
方法之前出现。
(随着故事的发展,将对此帖子进行编辑)