更改多行时使用 NSFetchedResultsController 禁用 UITableView 的动画
Posted
技术标签:
【中文标题】更改多行时使用 NSFetchedResultsController 禁用 UITableView 的动画【英文标题】:Disable animation of UITableView with NSFetchedResultsController when many rows are being changed 【发布时间】:2011-02-16 16:12:45 【问题描述】:在我的 UIView 中,我有一个由 NSFetchedResultsController (NSFRC) 控制的 UITableView (UITV)。 UIView 在 UINavigationController 中。
当视图即将被加载/显示时,我启动了一些后台活动,这些活动从远程服务器 (JSON) 获取数据并解析为核心数据。
当解析完成并且线程化的 NSManagedObjectContext 被合并到主上下文中时,NSFRC 被调用。
问题在于,有时会同时向 Core Data 插入许多行,添加大量表格单元格,从实际获取和解析完成到显示行之间存在相当长的延迟。
现在我想知道是否有人知道任何解决方案,例如:
将微调器连接到某个“获取的结果控制器在这次插入其所有行”(或某事)通知/委托调用,以至少告诉用户“某事将很快出现”?或者最好的解决方案是在后台获取和处理完成之前不初始化 NSFRC?
谢谢!
【问题讨论】:
实际花费最多的时间是什么?是服务器请求还是您试图从 Core Data 中获取大量项目?如果是 fetch 拖慢了您的速度,您可以修改您的 fetch 请求,使其仅在屏幕上最初获取所需数量的项目,然后按需延迟加载其余项目。 NSFetchedResultsController 的 fetchRequest 的批大小目前设置为 20,但是当插入超过 20 个对象时,这些对象也会在短时间内加载到内存中。你知道有什么方法可以改变 NSFetchedResultsControllerDelegate 函数只插入可见的行(或类似的东西)。 【参考方案1】:如果我正确理解您的问题,您可能需要查看 NSFetchedResultsControllerDelegate
方法,此处提供文档:http://developer.apple.com/library/ios/#documentation/CoreData/Reference/NSFetchedResultsControllerDelegate_Protocol/Reference/Reference.html
controllerWillChangeContent:
可用于预更改、controllerDidChangeContent
更改后以及didChangeSection:
和didChangeObject
更改期间的委托方法。
希望对你有帮助! 罗格
【讨论】:
我已经实现了这些委托函数,但在这些函数中我没有找到任何方法来确定是否有 100 个对象被更改(插入/更新/删除)或只有一个。 没关系。假设您想拥有任何类型的活动指示器,以便用户知道正在加载某些内容,您可以创建并将其添加到controllerWillChangeContent:
上的视图中,然后通知处理已在 controllerDidChangeContent
上完成,删除它从视图中让用户继续。有意义吗?以上是关于更改多行时使用 NSFetchedResultsController 禁用 UITableView 的动画的主要内容,如果未能解决你的问题,请参考以下文章
如何为选择多行时使用的 UITableViewCell 图像蒙皮?