使用MagicalRecord“CoreData无法解决错误”错误

时间:2014-07-06 19:16:06

标签: ios core-data magicalrecord

我正在使用MagicalRecord 2.2。 有时我在生产代码中收到'CoreData无法解决故障'的崩溃,并且我已经创建了一些测试代码来调查此问题。这是它的描述。

我有一个实体“对象”。在开始时,我在主线程上创建一个对象,然后我调用[MagicalRecord saveWithBlock:...],我从本地上下文中获取此对象并删除它。我在方法中添加了额外的日志记录(NSManagedObjectContext + MagicalSaves.m)

(void)MR_saveWithOptions :( MRSaveContextOptions)掩码完成

// BEFORE REAL SAVE is placed before line 'saved = [self save:&error];'
// AFTER REAL SAVE is placed after it

// Logging code line is:
//
// NSManagedObjectContext *context = ... (defaultContext/rootContext/self)
// NSArray *objects = [context executeFetchRequest:[NSFetchRequest fetchRequestWithEntityName:@"Object"] error:NULL];
// NSLog(@"%i objects in %@ context (%@)",
//         [objects count],
//         context == [NSManagedObjectContext defaultContext] ? @"main" :
//         context == [NSManagedObjectContext MR_rootSavingContext] ? @"root" : @"local",
//         [NSThread isMainThread] ? @"MAIN" : @"BACKGROUND");

2014-07-04 23:07:32.322 MyApp[3661:1703] BEFORE REAL SAVE // Current context is local   
2014-07-04 23:07:32.325 MyApp[3661:1703] 1 objects in default context (BACKGROUND)
2014-07-04 23:07:32.325 MyApp[3661:1703] 1 objects in root context (BACKGROUND)
2014-07-04 23:07:32.326 MyApp[3661:1703] 0 objects in current context (BACKGROUND) // We deleted object before save, so all is ok
2014-07-04 23:07:32.327 MyApp[3661:1703] AFTER REAL SAVE // Line 'saved = [self save:&error];' was executed
2014-07-04 23:07:32.328 MyApp[3661:1703] 0 objects in default context (BACKGROUND) // Why is object deleted here? We didn't call save for parent context yet
2014-07-04 23:07:32.339 MyApp[3661:1703] 0 objects in root context (BACKGROUND) // Same here, why changes are immediately propagated to all contexts?
2014-07-04 23:07:32.340 MyApp[3661:1703] 0 objects in local context (BACKGROUND)
2014-07-04 23:07:32.340 MyApp[3661:1703] BEFORE REAL SAVE // This save was called for localContext.parentContext, so current context is root
2014-07-04 23:07:32.341 MyApp[3661:1703] 0 objects in default context (BACKGROUND) 
2014-07-04 23:07:32.341 MyApp[3661:1703] 0 objects in root context (BACKGROUND) // Before save there are no objects in root context 
2014-07-04 23:07:32.342 MyApp[3661:1703] 0 objects in root context (BACKGROUND)
2014-07-04 23:07:32.343 MyApp[3661:1703] AFTER REAL SAVE
2014-07-04 23:07:32.343 MyApp[3661:1703] 0 objects in default context (BACKGROUND)
2014-07-04 23:07:32.343 MyApp[3661:1703] 0 objects in root context (BACKGROUND)
2014-07-04 23:07:32.420 MyApp[3661:1703] 0 objects in root context (BACKGROUND)   

也许我误解了什么?为什么在背景上修改默认上下文?

在生产代码中我有几个地方,当我处理异步事件(由performSelectorOnMainThread,NSNotification,NSTimer启动)时,我应该删除一些实体 X 的对象。我调用“saveWithBlock”,删除所需的实例,并在完成块发布通知后更新UI。

当我处理UI更新通知时,我有代码:

NSArray *objects = [Object findAll]; // #1
NSPredicate *unreadPredicate = [NSPredicate predicateWithFormat:@"isRead == %@", [NSNumber numberWithBool:NO]]; // #2
NSArray *unreadObjects = [objects filteredArrayUsingPredicate:unreadPredicate]; // #3

'CoreData无法解决故障'在第3行发生了崩溃。

似乎有些活动会修改“对象”,发布“更新用户界面”通知,同时其他活动会再次删除一些“对象”。在第1行提取对象后,在后台修改了defaultContext,并且过滤失败。这种崩溃很少发生,但它会发生。

我该如何处理这种情况?

0 个答案:

没有答案