1

快速提问。我有一个核心数据堆栈(子/父)上下文。孩子获取 json objs 并解析它们,然后将它们保存到父级,当计数为 20 时,父级获取主线程并保存......一切正常。然而,在我的表格视图中,我最终不得不每次都重新获取整个数据库!我的 fetchcount 和 duration 是巨大的,任何人都可以给我一些想法吗?我已经全力以赴提前感谢!也出于某种原因 [[[SharedStore ShareStoreManager]getMasterContext] reset] 工作正常......只是没有 mergeChangesFromContext!

NSNotificationCenter *mergeNotification = [NSNotificationCenter defaultCenter];
[mergeNotification addObserver:self
                      selector:@selector(mergeChanges:) 
                          name:NSManagedObjectContextDidSaveNotification 
                        object:[[SharedStore ShareStoreManager]getMasterContext]]



-(void)mergeChanges:(NSNotification *)notification {
     [[[SharedStore ShareStoreManager]getMasterContext] mergeChangesFromContextDidSaveNotification:notification];
     [self.tableView layoutIfNeeded];
     [self.tableView reloadData];
}  

编辑:我什至进入了上下文对象,看到插入的项目没有被合并,所以我进去强制它但仍然没有运气帮助!!!

for (User *user in [[notification.userInfo objectForKey:@"inserted"] allObjects]) {
        [[[SharedStore ShareStoreManager]getMasterContext] refreshObject:user mergeChanges:YES];
    }
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
}
4

1 回答 1

1

我会重新考虑您的设计并使用 aNSFetchedResultsController来获取您的对象。将该类用于数据源的好处在于,当托管对象上下文发生变化时,它会自动获得通知。通过为其实现委托回调,您可以让您的表格视图通过插入、删除、移动、修改表格视图中的相应行来响应获取的结果控制器数据中的更改。

这是一个教程,逐步概述了如何将其全部连接起来。

编辑: 查看您的代码,当您添加观察者时,您只是在侦听与主上下文发生的保存。如果您使用单独的上下文进行后台处理,则此通知只会针对该后台上下文发布,因此不会触发您的观察者。主上下文触发该通知的唯一方法是将后台上下文与主线程上下文合并并保存主线程上下文。

您的核心数据堆栈类应该有自己的观察者,监听所有保存事件:

[[NSNotificationCenter defaultCenter] addObserver:sharedController
                                         selector:@selector(contextDidSave:)
                                             name:NSManagedObjectContextDidSaveNotification
                                           object:nil];

然后它应该合并发生在不同线程和主线程上下文上的更改:

- (void)contextDidSave:(NSNotification *)notification {
    if (![NSThread isMainThread]) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self contextDidSave:notification];
        });
    } else {
        [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
    }
}

请注意,我们确保在主线程上执行合并,因为主上下文是在主线程上创建的并且不是线程安全的。合并完成后,通知将发送给观察者,例如NSFetchedResultsController将触发其自己的委托回调,让您有机会刷新 UI。

于 2013-07-06T04:16:47.983 回答