在我的应用程序中,我调用服务器API来获取用户列表。我使用NSFetchedResultsController在UITableView中显示这些用户。有些用户与当前连接的用户保持联系,而其他用户则没有。首先,我向您展示我的核心数据堆栈(使用MagicalRecord):
我设法向所有用户(联系人而非联系人)显示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];
}];
}
}
答案 0 :(得分:1)
不要合并兄弟情境。这会给你带来麻烦。 NSManagedObjectContext
的实例很便宜,当您使用私有队列上下文时,它们会在一个使用后被丢弃。使用它们,扔掉它们,为下一个需要完成的工作创建一个新的。
不需要合并更改通知。