核心数据后台线程NSManagedObjectContext合并错误

时间:2011-01-27 13:47:33

标签: iphone objective-c ipad ios core-data

我正在编写一个Ipad应用程序,该应用程序在队列中的单独NSOperation中显示文章并下载新文章,并将其插入到核心数据中。目前,我有一个单独的操作上下文,在操作的主方法中创建,并使用相同的协调器作为主上下文。我在NSManagedObjectContextDidSaveNotification的操作中使用了相同的模式,然后在主线程上下文中调用mergeChangesFromContextDidSaveNotification。问题是我收到了这个错误:

2011-01-27 07:26:02.574 Zagazine[12298:307] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Object's persistent store is not reachable from this NSManagedObjectContext's coordinator'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x3284b987 __exceptionPreprocess + 114
    1   libobjc.A.dylib                     0x31aca49d objc_exception_throw + 24
    2   CoreData                            0x3549d07b _PFRetainedObjectIDCore + 638
    3   CoreData                            0x3549cdfb - [NSManagedObjectContext(_NSInternalAdditions) _retainedObjectWithID:] + 14
    4   CoreData                            0x354bf85b -[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:] + 2170
    5   CoreFoundation                      0x327e9bbf -[NSObject(NSObject) performSelector:withObject:] + 22
    6   Foundation                          0x320fd795 __NSThreadPerformPerform + 268
    7   CoreFoundation                      0x328017dd __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 12
    8   CoreFoundation                      0x327d34fb __CFRunLoopDoSources0 + 194
    9   CoreFoundation                      0x327d2e5b __CFRunLoopRun + 230
    10  CoreFoundation                      0x327d2c87 CFRunLoopRunSpecific + 230
    11  CoreFoundation                      0x327d2b8f CFRunLoopRunInMode + 58
    12  GraphicsServices                    0x3094a4ab GSEventRunModal + 114
    13  GraphicsServices                    0x3094a557 GSEventRun + 62
    14  UIKit                               0x32c14329 -[UIApplication _run] + 412
    15  UIKit                               0x32c11e93 UIApplicationMain + 670
    16  ArticleApp                          0x0000233f main + 70
    17  ArticleApp                          0x000022f4 start + 40
)
terminate called after throwing an instance of 'NSException'
Program received signal:  “SIGABRT”.

这个有趣的部分是这个错误只发生在我安装它后第一次启动应用程序时。安装后的所有后续发布都可以正常工作。有谁知道为什么会发生这种错误以及为什么它只会在初始安装时发生。

此外,这是我合并上下文的方式,当它收到通知时会在后台线程上调用:

- (void)mergeChanges:(NSNotification *)notification {
    AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
    NSManagedObjectContext *mainContext = [appDelegate managedObjectContext];

    // Merge changes into the main context on the main thread
    [mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:) 
                              withObject:notification
                           waitUntilDone:YES];  
}

2 个答案:

答案 0 :(得分:17)

  

这个有趣的部分是这个错误只发生在我安装它后第一次启动应用程序时。安装后的所有后续发布都可以正常工作。有谁知道为什么会发生这种错误以及为什么它只会在初始安装时发生。

我的猜测是,在第一次启动时,持久存储未正确关联到磁盘上的文件。将URL分配给持久性存储协调器时,支持Core Data存储的文件不会实现。它仅在首次保存时实现。

在没有备份文件准备就绪的情况下合并更改会导致很多问题。

在创建后台线程之前,当Core Data上下文仍为空时,尝试在执行的早期第一次启动时从主线程保存上下文一次。希望这能解决您的问题。

答案 1 :(得分:0)

您是否在任何其他情况下观察到任何其他mergeChangesFromContextDidSaveNotification通知?如果是这样,那可能是您通知的订单。它可能会通知上下文不知道更改正在影响的模式(也就是说,'对象的持久存储无法从此NSManagedObjectContext的协调器访问')。