如何在不使用insertRowsAtIndexPaths的情况下加载fetchedResultsController?

时间:2012-10-23 16:45:59

标签: cocoa-touch core-data nsfetchedresultscontroller

我正在迭代一个文本数组,每次迭代我都是:

  • 使用initWithEntity创建托管对象:insertIntoManagedObjectContext
  • 解析文字
  • 确定显示顺序

新创建的对象以tableview结束。

由于fetchResultsController的超酷免费功能,当调用insertIntoManagedObjectContext时,单元格会自动插入到tableview中。

问题是处理每个新对象(~20ms)有一点延迟,并且文本行的顺序与正在更新的tableview的顺序不同。这使得屏幕闪烁,因为所有单元格都会找出它们的显示顺序,其他单元格会快速插入其后面。 (如果不清楚的话,我可以发布这种影响的视频,我不认为这很难形容。)

采用文本行并首先将它们解析为另一个数组,然后将THAT数组插入到moc中是合乎逻辑的,但我不能,因为这些是托管对象,我不能只是分配它们 - 我必须调用initWithEntity:insertIntoManagedObjectContext,然后自动将单元格插入到tableview中。

在didChangeObject方法中取出insertRowsAtIndexPaths:withRowAnimation,并在迭代完成时调用reloadData不起作用。 (应该吗?)

我只是希望在创建完所有对象之后才更新表。 我无法用fetchResultsController看到这样做的方法,即使没有一个也是微不足道的。因为经常跟我提出关于SO的问题 - 我在这里缺少什么

1 个答案:

答案 0 :(得分:0)

要停止对表格视图的更新,您只需将获取的结果控制器委托设置为nil

self.controller.delegate = nil;

要恢复更新,请再次设置委托,执行初始提取并重新加载表数据:

self.controller.delegate = self;
BOOL success = [controller performFetch:&error];
[self.tableView reloadData];

performFetch是必要的,因为获取的结果控制器在没有委托的情况下不跟踪对托管对象上下文的更改。


或者,您也可以使用第二个托管对象上下文在后台线程中添加数据,并仅在导入所有数据时保存该上下文。

主线程可以注册后台线程的NSManagedObjectContextDidSaveNotification并调用mergeChangesFromContextDidSaveNotification:来刷新对象。

在这种情况下,不需要更改获取的结果控制器。