Ios CoreData堆栈[子(后台)/父(线程1)]设置mergeChangesFromContextDidSaveNotification不更新UI(tableview)

Ios CoreData堆栈[子(后台)/父(线程1)]设置mergeChangesFromContextDidSaveNotification不更新UI(tableview),ios,core-data,Ios,Core Data,快速提问。我有一个核心数据堆栈(子/父)上下文。 子线程获取json objs并解析它们,然后将它们保存到父线程,当计数为20时,父线程获取主线程并保存…所有工作正常。然而,在我的tableview中,每次都必须重新绘制整个db!我的数量和持续时间都很长,有人能给我一些建议吗?我全力以赴,提前谢谢!同样由于某些原因[[[SharedStore ShareStoreManager]getMasterContext]reset]工作正常。。。只是不要从上下文中合并更改 NSNotificationC

快速提问。我有一个核心数据堆栈(子/父)上下文。 子线程获取json objs并解析它们,然后将它们保存到父线程,当计数为20时,父线程获取主线程并保存…所有工作正常。然而,在我的tableview中,每次都必须重新绘制整个db!我的数量和持续时间都很长,有人能给我一些建议吗?我全力以赴,提前谢谢!同样由于某些原因[[[SharedStore ShareStoreManager]getMasterContext]reset]工作正常。。。只是不要从上下文中合并更改

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

我会重新考虑你的设计,并使用一个工具来获取你的对象。将该类用于数据源的好处在于,当托管对象上下文中的情况发生变化时,它将自动获取通知。通过回调,您可以让tableview通过插入、删除、移动或修改表视图中的相应行来响应“获取结果”控制器数据中的更改

一步一步地概述如何将其连接起来

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

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

[[NSNotificationCenter defaultCenter] addObserver:sharedController
                                         selector:@selector(contextDidSave:)
                                             name:NSManagedObjectContextDidSaveNotification
                                           object:nil];
然后,它应该合并主线程上不同线程和上下文上发生的更改:


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

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

一步一步地概述如何将其连接起来

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

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

[[NSNotificationCenter defaultCenter] addObserver:sharedController
                                         selector:@selector(contextDidSave:)
                                             name:NSManagedObjectContextDidSaveNotification
                                           object:nil];
然后,它应该合并主线程上不同线程和上下文上发生的更改:


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

嘿,Wayne,感谢您提供的信息,但是观察者被称为-(void)mergeChanges:(NSNotification*)无法调用通知函数。仅[父上下文](始终维护线程)合并更改FromContextDidSaveNotification不会触发ui更新。。。正如我上面所说的,但是[main context]reset]在观察器回调中起作用。我要做的是,当子上下文计数到20时,我获取主队列,然后保存到父线程(主线程上下文),然后通知将其拾取并调用回调,只是该死的事情不想合并更改Hey Wayne,感谢您提供的信息,但观察者被称为-(void)mergeChanges:(NSNotification*)无法调用通知函数。仅[父上下文](始终维护线程)合并更改FromContextDidSaveNotification不会触发ui更新。。。正如我上面所说的,但是[main context]reset]在观察器回调中起作用。我要做的是,当子上下文的计数达到20时,我获取主队列,然后保存到父线程(主线程上下文),然后通知将其拾取并调用回调,只是该死的事情不想合并更改