【问题标题】:When merge to NSManagedObjectContext changes in existing objects, data in NSFetchedResultsController does not update当合并到现有对象中的 NSManagedObjectContext 更改时,NSFetchedResultsController 中的数据不会更新
【发布时间】:2011-06-30 09:32:54
【问题描述】:

我们有:

  • 2 个线程;
  • 每个线程都有自己的NSManagedObjectContext
  • 每个线程都有自己的NSFetchedResultsController
  • NSFetchedResultsControllers 的代表不为空;
  • 在主线程中NSFetchedResultsController 用于处理表格;
  • 在辅助线程中NSFetchedResultsController 仅用于数据访问。

如果您添加了新对象,则更改将与第二个线程 NSManagedObjectContext 的内容合并。

如果添加了对象,则NSFetchedResultsController 根据请求更新数据。 如果现有对象的属性被修改,那么NSFetchedResultsController不会更新数据。

为什么会这样?

【问题讨论】:

    标签: cocoa core-data nsfetchedresultscontroller nsmanagedobjectcontext


    【解决方案1】:

    您的更新代码路径是否与插入代码路径分开?如果是这样,您是否确认您的更新代码路径正在保存上下文的更改?

    【讨论】:

    • 当对象的属性发生变化时,我的线程中会调用合并函数,因此对象会保存在其他线程中。 ` ... [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onChangeDBC:) name:NSManagedObjectContextDidSaveNotification object:nil]; ... -(void)onChangeDBC:(NSNotification *)notification { [self performSelector:@selector(updateMOC:) onThread:myThread withObject:notification waitUntilDone:NO]; } .... -(void)updateMOC:(NSNotification *)notification { [cdHelper.mOC mergeChangesFromContextDidSaveNotification:notification]; } `
    【解决方案2】:

    最可能的原因是您没有实现 FRC 委托方法:

    – controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: 
    

    ...正确。具体来说,您需要检查NSFetchedResultsChangeUpdate 的更改类型,然后使用更改的值更新该特定对象的表格行单元格。

    【讨论】:

    • 我实现了空函数-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
    • 那是你的问题。空方法将不起作用。必须填充委托方法才能执行其任务。在这种情况下,委托方法应该为控制器识别的更改更新表。
    • 不,这不是问题,因为我的方法适用于插入的对象,不适用于更新的对象。当我添加和更新对象时,主线程中的 NSFetchedResultsController 会更新数据。
    • 对于更新的对象根本不调用controller:didChangeObject... 方法?或者它被调用但tableview没有更新?如果您不确定,请记录 forChangeType: 值以查看它的响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    相关资源
    最近更新 更多