0

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

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

新创建的对象以表格视图结束。

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

问题是处理每个新对象(~20ms)有轻微的延迟,并且文本行的顺序与正在更新的表格视图的顺序不同。这使得屏幕闪烁,因为所有单元格都弄清楚了它们的显示顺序,其他单元格迅速插入到它们后面。(如果不清楚,我可以发布这个效果的视频,我没想到会这么难描述。)

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

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

我只希望在创建所有对象之前不要更新表。 我看不到使用 fetchResultsController 的方法,即使没有它会很简单。正如我经常提出的关于 SO 的问题一样——我在这里错过了什么?

4

1 回答 1

0

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

self.controller.delegate = nil;

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

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

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


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

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

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

于 2012-10-23T18:20:59.970 回答