2012-10-23 68 views
0

我迭代通过文本的阵列,随着每次迭代我:如何在不使用insertRowsAtIndexPaths的情况下加载fetchResultsController?

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

随着新创建的对象以tableview结尾。

因为fetchResultsController的超爽免费功能,如insertIntoManagedObjectContext被称为细胞得到自动插入的tableview。

的问题是存在在处理每个新对象(〜20毫秒)有轻微的延迟和文本的行的顺序比正在更新的tableview中被不同地排序。这会导致屏幕闪烁,因为所有的单元格都显示出它们的显示顺序,而其他单元格快速插入它们后面。 (如果不清楚,我可以发布这种效果的视频,但我不认为这很难描述它。)

采用文本行并首先将它们解析为另一个数组是合乎逻辑的,然后插入阵列到商务部,但我不能因为这些管理对象,我不能只是ALLOC他们 - 我要打电话initWithEntity:insertIntoManagedObjectContext,这反过来会自动将细胞进入的tableview。

取出insertRowsAtIndexPaths:withRowAnimation在didChangeObject方法,只是调用reloadData当迭代结束没有工作。 (应该吧?)

我只是想表不更新已创建的所有对象后,直到。 我看不出用fetchResultsController做到这一点的方法,即使它没有一个也是微不足道的。由于经常出现我在SO-上的问题,我在这里丢失了什么

回答

0

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

self.controller.delegate = nil; 

要继续更新,重新设置委托,执行初始抓取,并重新加载表中的数据:

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

performFetch是必要的,因为所取出的结果控制器不跟踪对被管理对象的上下文而它没有委托。


或者,你也可以在后台线程中添加数据,使用第二管理对象上下文和保存,只有当所有数据导入这方面。

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

在这种情况下,对读取的结果控制器没有变化是必要的。

+0

将fetchController设置为nil很好。如果不是那样的话,我会在我的第一个Hello World应用程序中... –

相关问题