更改多行时使用 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 图像蒙皮?

当多行/列组合不满足要求时更改值

Terraform 会根据运行时环境不断更改多行 heredoc 的行尾

在界面生成器中更改标签以允许多行视图的宽度加倍

选择多行时QTableView变得很慢

Datatable vuetify 选择多行(Shift+单击)