带有 didChangeObject 的 NSFetchedResultsController 在表格视图中显示单元格的速度很慢

Posted

技术标签:

【中文标题】带有 didChangeObject 的 NSFetchedResultsController 在表格视图中显示单元格的速度很慢【英文标题】:NSFetchedResultsController with didChangeObject is slow to show cell in tableview 【发布时间】:2012-10-03 15:35:07 【问题描述】:

我使用 NSFetchedResultsControllerDelegate 在我的所有数据都下载并插入 coreData 后显示我的单元格。 我使用下面的代码知道何时发生了修改

[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshDatas:) name:NSManagedObjectContextDidSaveNotification object:nil];

然后,调用这个方法

- (void)refreshDatas:(NSNotification *)notification

    [[self.fetchedResultsController managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];

但是,我有一个问题,代理 NSFetchedResultsControllerDelegate 的 insertRowAtIndexPath 的第一次调用和 UITableView 中插入的单元格的显示之间有 5 到 10 秒,我不知道为什么。

感谢您的帮助

【问题讨论】:

你在使用后台线程吗? 【参考方案1】:

如果您使用的是后台线程并且在那里触发了通知,您需要在主线程中“重新发布”通知,例如:

- (void)refreshDatas:(NSNotification*)notification

  if ([notification object] == [self managedObjectContext]) return;

  if (![NSThread isMainThread]) 
      [self performSelectorOnMainThread:@selector(refreshDatas:) withObject:notification waitUntilDone:YES];
      return;
  

  [[self managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];

如果这不是问题,请尝试在您的问题中添加一些细节。核心数据很难,没有细节就很难理解发生了什么。

编辑

如果[notification object](在这种情况下为上下文)是主要的,则您不会合并更改。相反,如果该上下文来自不同的线程,则合并更改。这是出于性能原因,但您可以简单地将其删除。

希望对您有所帮助。

【讨论】:

非常感谢你,但我不明白你为什么这样做:if ([notification object] == [self managedObjectContext]) return; @marcL 我添加了一个编辑。如果您愿意,也可以投票。该解决方案对您有用吗?

以上是关于带有 didChangeObject 的 NSFetchedResultsController 在表格视图中显示单元格的速度很慢的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchedResultsController didChangeObject indexPath 为空

didChangeObject:未调用 NSFetchedResultsController

NSFetchedResultsController 没有调用 didChangeObject

Swift 2.0 转换问题 NSFetchedResultsController didChangeObject

当 didChangeObject 被调用 NSFetchedResultsController 时,UITableView 没有更新

NSFetchedResultsController 并不总是为 NSFetchedResultsChangeMove 调用 didChangeObject:atIndexPath:forChange