ios - 两个私有(private)队列上下文之间的 mergeChangesFromContextDidSaveNotification

标签 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];
        }];
    }
}

最佳答案

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

无需合并更改通知。

关于ios - 两个私有(private)队列上下文之间的 mergeChangesFromContextDidSaveNotification,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31536110/

相关文章:

iphone - 如何在 iOS 应用程序中制作 Twitter 的行菜单?

ios - 观察 UIPageViewController 的过渡状态

iOS - 如何在用户拖动时触摸的线上绘制点

iOS 核心数据和单元测试 : multiple managed object context getting created

iPhone 有没有比固定屏幕更快的方法来保护应用程序?

ios - 如何将另一个版本的应用程序上传到 itunesconnect?

ios - 在 didUpdateFrame 方法中保存 ARSCNView 快照会导致相机卡住

ios - 何时需要将应用程序源包含在测试目标中?

ios - 从 nsdictionary 中删除键/值

uitableview - NSFetchedResultsController - 谓词的运行时变量更改