我试图通过使用带有CoreData的NSFetchedResultsController调用mergeChangesFromContextDidSaveNotification,将addsManagedObjectContext中的更改合并到我的主要managedObjectContext中。像这样:
- (void)addGoalViewController:(AddGoalViewController *)controller didFinishWithSave:(BOOL)save {
if (save) {
NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
[dnc addObserver:self
selector:@selector(addControllerContextDidSave:)
name:NSManagedObjectContextDidSaveNotification
object:addingManagedObjectContext];
NSLog(@"Before save - addingManagedObjectContext - Number of registered objects: %d", [[addingManagedObjectContext registeredObjects] count]);
NSLog(@"Before save - addingManagedObjectContext - Number of inserted objects: %d", [[addingManagedObjectContext insertedObjects] count]);
NSLog(@"Before save - addingManagedObjectContext - Number of updated objects: %d", [[addingManagedObjectContext updatedObjects] count]);
NSLog(@"Before save - addingManagedObjectContext - Number of deleted objects: %d", [[addingManagedObjectContext deletedObjects] count]);
// Save the new object to the adding managed object context
NSError *error = nil;
if ([addingManagedObjectContext hasChanges] && [addingManagedObjectContext save:&error] == NO) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
NSLog(@"After save - addingManagedObjectContext - Number of registered objects: %d", [[addingManagedObjectContext registeredObjects] count]);
NSLog(@"After save - addingManagedObjectContext - Number of inserted objects: %d", [[addingManagedObjectContext insertedObjects] count]);
NSLog(@"After save - addingManagedObjectContext - Number of updated objects: %d", [[addingManagedObjectContext updatedObjects] count]);
NSLog(@"After save - addingManagedObjectContext - Number of deleted objects: %d", [[addingManagedObjectContext deletedObjects] count]);
// Remove the adding context observer
[dnc removeObserver:self name:NSManagedObjectContextDidSaveNotification object:addingManagedObjectContext];
}
// Reset the adding context back to its default state
[addingManagedObjectContext reset];
// Release the adding managed object context.
self.addingManagedObjectContext = nil;
// Dismiss the add goal view to return to the main list
[self dismissModalViewControllerAnimated:YES];
}
我正在关注CoreDataBooks示例当我尝试合并更改时虽然它不起作用。这是我的合并代码:
- (void)addControllerContextDidSave:(NSNotification *)saveNotification {
NSManagedObjectContext* context = [fetchedResultsController managedObjectContext];
// Merging changes causes the fetched results controller to update its results
NSLog(@"Before merge - managedObjectContext - Number of registered objects: %d", [[context registeredObjects] count]);
NSLog(@"Before merge - managedObjectContext - Number of inserted objects: %d", [[context insertedObjects] count]);
NSLog(@"Before merge - managedObjectContext - Number of updated objects: %d", [[context updatedObjects] count]);
NSLog(@"Before merge - managedObjectContext - Number of deleted objects: %d", [[context deletedObjects] count]);
[context mergeChangesFromContextDidSaveNotification:saveNotification];
NSLog(@"After merge - managedObjectContext - Number of registered objects: %d", [[context registeredObjects] count]);
NSLog(@"After merge - managedObjectContext - Number of inserted objects: %d", [[context insertedObjects] count]);
NSLog(@"After merge - managedObjectContext - Number of updated objects: %d", [[context updatedObjects] count]);
NSLog(@"After merge - managedObjectContext - Number of deleted objects: %d", [[context deletedObjects] count]);
}
不幸的是,它似乎没有将对象添加到我的主要托管对象上下文中,它添加到我的addsManagedObjectContext但是在合并之后它应该将它们合并到主要托管对象上下文中。但是,我的主要托管对象上下文中的已注册对象数仍为0.保存后,请参阅addingManagedObjectContext中的1个注册对象?那应该在我的主要的managedObjectContext中,因为我合并了它,但事实并非如此。它反而停留在我的AddingManagedObjectContext中。
我查看了Apple Class Reference文档,从我看过的内容看来似乎是
Before save - addingManagedObjectContext - Number of registered objects: 1
Before save - addingManagedObjectContext - Number of inserted objects: 1
Before save - addingManagedObjectContext - Number of updated objects: 1
Before save - addingManagedObjectContext - Number of deleted objects: 0
Before merge - managedObjectContext - Number of registered objects: 0
Before merge - managedObjectContext - Number of inserted objects: 0
Before merge - managedObjectContext - Number of updated objects: 0
Before merge - managedObjectContext - Number of deleted objects: 0
After merge - managedObjectContext - Number of registered objects: 0
After merge - managedObjectContext - Number of inserted objects: 0
After merge - managedObjectContext - Number of updated objects: 0
After merge - managedObjectContext - Number of deleted objects: 0
After save - addingManagedObjectContext - Number of registered objects: 1
After save - addingManagedObjectContext - Number of inserted objects: 0
After save - addingManagedObjectContext - Number of updated objects: 0
After save - addingManagedObjectContext - Number of deleted objects: 0
从这个输出中可以看出,它是将对象添加到addingManagedObjectContext,但它没有将对象合并到主要的managedObjectContext中。相反,该对象保留在addingManagedObjectContext中。从Apple Class Reference看来,这似乎不应该发生。相反,它应该将对象合并到managedObjectContext中。并且似乎没有任何方法可以检查mergeChangesFromContextDidSaveNotification是否有错误。
答案 0 :(得分:0)
我的理解是NSFetchedResultsController应该自动更新和合并上下文中的数据。如果在保存第二个上下文之前,您的对象位于Fetched Result Controller的上下文中,那么 应该正在观察这些更新。您可以通过在控制器上设置委托并实现方法来自行检查:
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
根据Apple的文档:
通知接收方提取的结果控制器已完成由于添加,删除,移动或更新而导致的一项或多项更改的处理。