使用MagicalRecord'CoreData无法解决错误'错误

我正在使用MagicalRecord 2.2。 有时我会在产品代码中收到“CoreData无法完成故障”的崩溃,并且已经创build了一些testing代码来调查此问题。 这是它的描述。

我有一个实体“对象”。 一开始,我在主线程上创build一个对象,然后调用[MagicalRecord saveWithBlock:…],从本地上下文中获取这个对象并删除它。 我添加了额外的日志logging方法(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) 

也许我误解了一些东西? 为什么在后台修改默认上下文?

在生产代码中,我有几个地方,当我处理asynchronous事件(由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行发生崩溃。

看起来,某些活动修改了“对象”,发布了“更新UI”通知,同时其他活动再次删除了一些“对象”。 在#1行获取对象后,defaultContext在后台被修改,并且过滤失败。 这种崩溃很less发生,但它发生。

我该如何处理这种情况?