Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 核心数据后台线程NSManagedObjectContext合并错误_Iphone_Objective C_Ipad_Ios_Core Data - Fatal编程技术网

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

Iphone 核心数据后台线程NSManagedObjectContext合并错误,iphone,objective-c,ipad,ios,core-data,Iphone,Objective C,Ipad,Ios,Core Data,我正在编写一个Ipad应用程序,它在一个单独的操作队列中显示文章和下载新文章,并将它们插入核心数据。目前,我有一个单独的操作上下文,在操作的主方法中创建,并使用与主上下文相同的协调器。我使用的模式与建议在该操作中多次侦听NSManagedObjectContextDidSaveNotification的模式相同,然后在主线程上下文上调用mergeChangesFromContextDidSaveNotification。问题是我遇到了以下错误: 2011-01-27 07:26:02.574 Z

我正在编写一个Ipad应用程序,它在一个单独的操作队列中显示文章和下载新文章,并将它们插入核心数据。目前,我有一个单独的操作上下文,在操作的主方法中创建,并使用与主上下文相同的协调器。我使用的模式与建议在该操作中多次侦听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];  
}
有趣的是,这个错误只在我安装应用程序后第一次启动应用程序时发生。安装后的所有后续启动都可以正常工作。有人知道为什么会发生此错误,以及为什么只有在初始安装时才会发生此错误吗

我猜在第一次启动时,持久性存储没有正确地与磁盘上的文件关联。将支持核心数据存储的文件的URL分配给持久存储协调器时,该文件不会具体化。它只有在第一次保存时才具体化

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


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

您是否有任何其他上下文观察到的来自ContextDidSaveNotification的任何其他
合并更改?如果是这样的话,它可能是您正在通知的订单。它可能是在通知不知道更改所影响的架构的上下文(也称为“无法从此NSManagedObjectContext的协调器访问对象的持久存储”)。

是的,这是可行的,我在应用程序启动时添加了代码,在任何其他背景内容发生之前删除了所有对象,它做到了这一点。这正常吗?我的设计有什么问题吗?我目前让它在应用程序中启动同步操作队列:didFinishLaunchingWithOptions,用于下载数据和插入。保存时不必删除对象。当我说当核心数据上下文为空时应该保存一次时,我的意思是,当程序安装到给定设备上后第一次启动时,应该在最开始时保存。你的设计对我来说非常合适。只是从后台线程访问核心数据是。。。棘手的我删除这些对象纯粹是为了测试,我从Web服务下载json并插入到我的存储中,所以我喜欢更改json数据来测试它。很抱歉给你带来困惑,谢谢你的回答+1+1表示良好的“猜测”。在第一次启动或删除持久存储文件后立即调用
save:
,为我修复了错误。谢谢