我没有从我提供给 Simperium 的 NSManagedObjectContext 收到 NSManagedObjectContextDidSaveNotification 通知。
基本上我喜欢做的是在由于 simperium 更新而发生数据库更新时通知我的应用程序。
因此,我使用 2 个 NSManagedObjectContexts,一个用于我的应用程序,另一个用于 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];
}