Simperium に渡した NSManagedObjectContext から NSManagedObjectContextDidSaveNotification 通知を受け取りません。
基本的に私がやりたいことは、simperium による更新が原因でデータベースの更新が発生したときにアプリケーションに通知することです。
したがって、2 つの NSManagedObjectContext を使用しています。1 つはアプリケーション用、もう 1 つは Simperium 用です。アプリケーションがコンテキストを保存すると、変更は NSManagedObjectContextDidSaveNotification 通知で simperium コンテキストにマージされますmergeChangesFromContextDidSaveNotification:
。
ただし、問題は、Simperium NSManagedObjectContext が更新されるたびに、NSManagedObjectContextDidSaveNotification を取得できないため、リモートからアプリケーション コンテキストに変更をマージできないことです。実際にデータを永続ストアに保存することを確認しました。
いくつかのコード:
- (void) setSyncingEnabled:(BOOL)syncingEnabled
{
if (syncingEnabled && !self.simperium)
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(syncingObjectContextDidSaveNotification:)
name:NSManagedObjectContextDidSaveNotification
object:self.syncingObjectContext];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(objectContextDidSaveNotification:)
name:NSManagedObjectContextDidSaveNotification
object:self.objectContext];
self.simperium = [[Simperium alloc] initWithRootViewController:App.delegate.window.rootViewController];
self.simperium.authenticationOptional = YES;
[self.simperium addDelegate:self];
[self.simperium startWithAppID:kSimperiumAppId
APIKey:kSimperiumAPIKey
model:self.objectModel
context:self.syncingObjectContext
coordinator:self.storeCoordinator];
}
else if (self.simperium) {
self.simperium = nil;
[[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:self.syncingObjectContext];
[[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:self.objectContext];
}
}
- (void) objectContextDidSaveNotification:(NSNotification*)notification
{
if (self.simperium) {
[self.syncingObjectContext mergeChangesFromContextDidSaveNotification:notification];
}
}
- (void) syncingObjectContextDidSaveNotification:(NSNotification*)notification
{
[self.objectContext mergeChangesFromContextDidSaveNotification:notification];
/* Inform Application */
[[NSNotificationCenter defaultCenter] postNotificationName:DatabaseDidUpdateExternallyNotification object:self];
}