0

我在合并两个上下文之间的更改时遇到问题。其中之一是在后台(附加上下文)中作为 Web 服务读取和写入数据到数据库。当我尝试保存主上下文中的任何更改时,应用程序卡住了,什么也没发生。我创建的来自 Web 服务(单例)的上下文,如下所示。当我尝试保存主上下文时,我发送通知以将更改与 WebServices 上下文合并,但它无法正常工作。怎么了?当后台正在读取数据并且主要上下文尝试在数据库中保存某些内容时会发生这种情况。

managedObjectContext = [NSManagedObjectContext new];
NSPersistentStoreCoordinator *store = [ [theDelegate managedObjectContext] persistentStoreCoordinator];
[managedObjectContext setPersistentStoreCoordinator:store];
[managedObjectContext setStalenessInterval:0.0];

在保存我使用的主要上下文之前:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mergeChanges:) name:NSManagedObjectContextDidSaveNotification object:self.managedObjectContext];

我在哪里合并更改

 [[[WebServie instance] managedObjectContext] mergeChangesFromContextDidSaveNotification:notification]

它应该可以工作,但我不知道出了什么问题,WebServices 在后台工作,DataBaseManager 在主线程中


那是我的合并上下文的代码是错误的吗?

NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
[dnc addObserverForName:NSManagedObjectContextDidSaveNotification
                 object: self.managedObjectContext queue:nil
             usingBlock:^(NSNotification *notification)
 {
     NSLog(@"merge");
     [[[WebServiceManager instance] managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];

 }];

NSError *error;
NSLog(@"error");
if (![self.managedObjectContext save:&error])
{
    NSLog(@"error :%@", error);// Update to handle any error appropriately.
}
NSLog(@"after error");

[dnc removeObserver:self
               name:NSManagedObjectContextDidSaveNotification
             object:self.managedObjectContext];
4

2 回答 2

0

您需要在应该进行合并的上下文队列上进行合并。不在发送它的队列(或线程)上。

于 2012-09-14T15:02:10.343 回答
0

如果您试图保持两个上下文同步,则需要监听两个上下文的 NSManagedObjectContextDidSaveNotification,并将第一个上下文的通知合并到第二个上下文,反之亦然。所以,假设你的 applicationDelegate 上有你的上下文,你的 web 单例上有一个上下文。您将在您的 applicationDelegate 上创建一个方法,以便在单例上下文保存时触发。在该方法上,您将从单例对象获取通知并将其与主线程上下文合并。在你的单例上,你会从主线程监听 NSManagedObjectContextDidSaveNotification 并将它与单例的上下文合并。

于 2012-09-14T15:10:20.357 回答