NSManagedObjectController没有合并来自AddingManagedObjectContext的更改

时间:2011-05-12 19:37:43

标签: iphone objective-c core-data nsmanagedobject nsmanagedobjectcontext

我试图通过使用带有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是否有错误。

1 个答案:

答案 0 :(得分:0)

我的理解是NSFetchedResultsController应该自动更新和合并上下文中的数据。如果在保存第二个上下文之前,您的对象位于Fetched Result Controller的上下文中,那么 应该正在观察这些更新。您可以通过在控制器上设置委托并实现方法来自行检查:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller

根据Apple的文档:

  

通知接收方提取的结果控制器已完成由于添加,删除,移动或更新而导致的一项或多项更改的处理。

有关详情:NSFetchedResultsControllerDelegate