【问题标题】:tableView reloadData for filtering datatableView reloadData 用于过滤数据
【发布时间】:2011-12-10 23:30:58
【问题描述】:

作为上一篇文章的后续问题:filtering content for UITableView

在为 UITableViews 过滤数据集时,假设我按照上一篇文章中的建议使用 NSPredicate,总体思路是否如下所示:

NSArray *allData;
NSMutableArray *filteredData;
  • 当过滤器按钮被按下时,使用 NSPredicate 来填充
  • filteredData 使用[tableView reloadData]; 重新加载表

在我的tableView数据源和委托方法中,我基本上会检查过滤器按钮是否打开,如果它显示了filteredData,如果没有,则显示allData。

我不确定的是,在 WWDC 2010 的一个关于 tableview 的视频中,他们说 reloadData 是一项昂贵的操作,你应该更新你的视图,而不是使用 tableView 的插入/删除/替换方法。动画还为用户提供了正在发生的事情的上下文。那么如果是这样的话,你还使用reloadData吗?我似乎无法弄清楚如果打开过滤器并且未调用 reloadData,tableViews 将如何知道要显示什么。我假设如果打开过滤器,您将不得不重新加载数据,然后如果您想为用户提供一些正在发生的事情的上下文,还可以使用动画的插入/删除/替换方法更新视图。是对的吗?谢谢。

【问题讨论】:

    标签: iphone uitableview filter


    【解决方案1】:

    如果我对您的理解正确,数据集并不仅仅改变它的显示顺序(过滤)。如果是这种情况,调用重新加载数据是正确的做法。使用插入/删除/删除动画主要用于编辑表格视图(在编辑模式下)。或者在接收“更多”数据或数据更新时(例如来自 iCloud)。我只发现如果数据源非常大且带有未缓存的图像或其他一些大型慢速读取数据(如对远程服务器的静止 XML 调用),则在 tableview 上调用重新加载数据会很昂贵。如果您主要处理文本和/或小型缓存图像,则根本不应该有任何问题。如果过滤正在删除或添加项目到您的数组,您需要通过索引路径跟踪它们在 tableview 中的位置,删除它们,然后添加新的部分。考虑到平台,为单个数据源保留多个数组的成本要高得多。当我们处理 iOS 时,内存管理是优先事项,恕我直言。

    这里要注意的另一件事是,行或节的实际插入和/或删除必须在以 [beginUpdates] 开始并以 [endUpdates] 结束的动画块内。除非您从编辑委托方法中进行操作。

    【讨论】:

      【解决方案2】:

      我认为 WWDC 2010 视频是说,如果可以和/或如果您的应用程序存在性能问题,您应该使用 insert/delete/replace 而不是 reloadData。但它似乎不适合您的 filter-ON/filter-OFF 需求。

      做你想做的事,我认为 reloadData 很好。如果您真的想跳过 reloadData,您可以使用 CoreData 和 NSFetchedResultsController 以及使用“可见”属性的谓词,该属性根据您的过滤器当前值设置为 true 或 false(然后您可以使用 NSFetchedResultsController 通知很好地为您的更改设置动画)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多