gpt4 book ai didi

ios - CoreData 堆栈 [child(background)/parent(thread 1)] setup mergeChangesFromContextDidSaveNotification 不更新 UI(tableview)

转载 作者:行者123 更新时间:2023-11-29 13:10:34 25 4
gpt4 key购买 nike

快速提问。我有一个核心数据堆栈(子/父)上下文。 child 获取 json objs 并解析它们,然后将它们保存到父级,当计数为 20 时,父级获得主线程并保存......一切正常。但是在我的表格 View 中,我每次都不得不重新获取整个数据库!我的 fetchcount 和持续时间对此有很大影响,任何人都可以给我一些想法吗?我已经全力以赴了,谢谢!同样出于某种原因 [[[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];
}

最佳答案

我会重新考虑您的设计并使用 NSFetchedResultsController做你的对象的获取。将该类用于数据源的好处在于,当其托管对象上下文发生变化时,它会自动收到通知。通过 implementing the delegate它的回调,您可以让您的 TableView 通过插入、删除、移动、修改 TableView 中的适当行来响应获取的结果 Controller 数据的变化。

Here's a tutorial逐步概述如何将其全部连接起来。

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

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

[[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,它将触发自己的委托(delegate)回调,让您有机会刷新 UI。

关于ios - CoreData 堆栈 [child(background)/parent(thread 1)] setup mergeChangesFromContextDidSaveNotification 不更新 UI(tableview),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17499380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com