两个私有队列上下文之间的mergeChangesFromContextDidSaveNotification

时间:2015-07-21 10:08:36

标签: ios objective-c core-data merge magicalrecord

在我的应用程序中,我调用服务器API来获取用户列表。我使用NSFetchedResultsController在UITableView中显示这些用户。有些用户与当前连接的用户保持联系,而其他用户则没有。首先,我向您展示我的核心数据堆栈(使用MagicalRecord): enter image description here

我设法向所有用户(联系人而非联系人)显示usersContext我在其中创建/更新/删除Web服务中的所有用户。每次我保存tableView都会更新。这很好。

但是我想将usersContext合并到contactsContext,以便仅保存商店中的联系人,以便在下次启动应用时直接显示它们。这是我的问题。当我contactsContext mergeChangesFromContextDidSaveNotification没有用户被保存时(当然还有联系人)。也许我的核心数据堆栈或我的代码是错误的:

// init
- (void)configureContactsStack
{
    _contactsContext = [NSManagedObjectContext MR_contextWithStoreCoordinator:[NSPersistentStoreCoordinator MR_defaultStoreCoordinator]];
    [_contactsContext MR_setWorkingName:@"Contacts context"];

    _usersContext = [NSManagedObjectContext MR_contextWithParent:[NSManagedObjectContext MR_defaultContext]];
    [_usersContext MR_setWorkingName:@"Users context"];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(usersContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:_usersContext];
}


- (void)getAllUsers
{
    // async server call with main thread callback :
        [self.usersContext performBlock:^{
            // ... create/update/delete users in usersContext with server objects
            [self.usersContext MR_saveOnlySelfAndWait]; // will call usersContextDidSave:
        }];
    // end of server callback
}


- (void)usersContextDidSave:(NSNotification *)notification
{
    if (notification.object == self.usersContext) {
        [self.contactsContext performBlock:^{
            [self.contactsContext mergeChangesFromContextDidSaveNotification:notification];
            // delete all users not contacts from contactsContext
            [Users deleteAllMatchingPredicate:[NSPredicate predicateWithFormat:@"contact != 1"] inContext:self.contactsContext];
            [self.contactsContext MR_saveToPersistentStoreWithCompletion:nil];
        }];
    }
}

1 个答案:

答案 0 :(得分:1)

不要合并兄弟情境。这会给你带来麻烦。 NSManagedObjectContext的实例很便宜,当您使用私有队列上下文时,它们会在一个使用后被丢弃。使用它们,扔掉它们,为下一个需要完成的工作创建一个新的。

不需要合并更改通知。