作为上一篇文章的后续问题:filtering content for UITableView
在为UITableViews过滤数据集时,假设我按照上一篇文章中的建议使用了NSPredicate,那么一般的想法是这样的:
NSArray *allData;
NSMutableArray *filteredData;
[tableView reloadData];
在我的tableView数据源和委托方法中,我基本上检查过滤器按钮是否打开,如果显示过滤数据,如果没有,则显示allData。
我不确定的是,在一个关于tableviews的WWDC 2010视频中,他们说reloadData是一项昂贵的操作,你应该使用tableView的insert / delete / replace方法来更新你的视图。动画还为用户提供了正在发生的事情的背景。那么如果是这种情况,你还使用reloadData吗?我似乎无法弄清楚如果打开过滤器并且未调用reloadData,tableViews将如何知道要显示的内容。我假设如果启用了过滤器,则必须重新加载数据,然后如果要向用户提供有关正在发生的事情的上下文,则还要使用插入/删除/替换方法更新视图。是对的吗?感谢。
答案 0 :(得分:0)
我认为WWDC 2010视频说如果你可以和/或你的应用程序有性能问题,你应该使用insert / delete / replace而不是reloadData。但它似乎不适合您的过滤器ON /过滤器OFF需要。
要做你想做的事我认为reloadData很好。如果你真的想跳过reloadData,你可以使用CoreData和一个带有谓词的NSFetchedResultsController,使用你设置为true或false的“visible”属性,具体取决于你的过滤器当前值(然后你可以使用NSFetchedResultsController通知来很好地设置你的变化动画)。
答案 1 :(得分:0)
如果我理解正确,数据集不会改变它的显示顺序(过滤)。如果是这种情况,则调用重载数据是正确的做法。使用插入/删除/删除动画主要用于编辑tableview(在编辑模式下)。或者在接收"更多"数据或数据更新(例如来自iCloud)。如果dataSource对于未缓存的图像或其他一些大的慢速读取数据(如对远程服务器的宁静XML调用)非常大,我只发现在tableview上调用重载数据会很昂贵。如果你主要处理文本和/或小缓存图像,它根本不应该是任何问题。如果过滤正在删除或向项目添加项目,则需要通过索引路径跟踪它们在tableview中的位置,删除它们,然后添加新项目。考虑到平台,为单个数据源保留多个阵列会更加昂贵。当我们处理iOS,恕我直言时,内存管理是首要任务。
这里要注意的另一件事是行或部分的实际插入和/或删除必须在动画块内部,以[beginUpdates]开头并以[endUpdates]结尾。除非你从编辑委托方法中做到这一点。