0

2 つのコンテキスト間で変更をマージする際に問題があります。そのうちの 1 つは、WebServices がデータベースにデータを読み書きするため、バックグラウンド (追加のコンテキスト) で動作しています。メインコンテキストで変更を保存しようとしている間に、アプリケーションが動かなくなり、何も起こりませんでした。以下に示すように、私が作成する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

2 つのコンテキストの同期を維持しようとしている場合は、両方のコンテキストの NSManagedObjectContextDidSaveNotification をリッスンし、最初のコンテキストの通知を 2 番目のコンテキストにマージする必要があります。したがって、applicationDelegate にコンテキストがあり、Web シングルトンにコンテキストがあるとします。シングルトン コンテキストが保存されたときに起動されるように、applicationDelegate にメソッドを作成します。そのメソッドでは、シングルトン オブジェクトから通知を受け取り、それをメイン スレッド コンテキストとマージします。シングルトンでは、メイン スレッドから NSManagedObjectContextDidSaveNotification をリッスンし、それをシングルトンのコンテキストとマージします。

于 2012-09-14T15:10:20.357 に答える
0

マージを行うはずのコンテキストのキューでマージを行う必要があります。送信されているキュー (またはスレッド) ではありません。

于 2012-09-14T15:02:10.343 に答える