2012-09-13 43 views
0

我在合并两个上下文之间的更改时遇到问题。其中之一是作为WebServices读取和写入数据到数据库的背景(附加上下文)。当我尝试保存主要上下文中的任何更改时,应用程序都陷入了僵局,没有任何事情发生。来自Web服务(单例)的上下文我创建,如下所示。当我尝试保存主要上下文时,我发送通知以将更改与WebServices上下文合并,但无法正常工作。怎么了?它发生在后台正在读取数据和主要上下文尝试保存我的数据库的东西。在后台工作的NSManagedObjectContext

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] 

它应该工作,但我不知道怎么回事错误,Web服务是在后台工作,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]; 

回答

0

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

+0

保存主要上下文之前我使用:[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mergeChanges :) name:NSManagedObjectContextDidSaveNotification object:self.managedObjectContext]; – mbutan

0

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

+0

是的,我这样做我使用通知来合并他们之间的变化,但我不知道在从WebServices数据(在后台工作)创建数据期间出了什么问题。我得到一些ManagedObject,我尝试通过web服务发送它们,同时我在Main Context上做了一些操作,在这一刻我的应用程序一直卡在一起,没有任何错误。 – mbutan