在我的应用程序中,我调用服务器 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];
}];
}
}
最佳答案
不要合并兄弟上下文。那会给你带来麻烦。 NSManagedObjectContext
的实例很便宜,当您使用私有(private)队列上下文时,它们会在一次 使用后被丢弃。使用它们,扔掉它们,为下一个需要完成的工作创建一个新的。
无需合并更改通知。
关于ios - 两个私有(private)队列上下文之间的 mergeChangesFromContextDidSaveNotification,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31536110/