我正在查看Apple的TableSearch示例代码。看起来他们有所有内容的NSArray,以及过滤内容的NSMutableArray。然后,如果过滤器打开,那么它们将显示NSMutableArray。如果它关闭,它们将显示具有所有数据的NSArray。
1)我想知道这是否是过滤器的常见实现,因为我之前没有做过多次过滤。
2)要添加到该问题,如果我有四个不同类别的过滤器,我还会使用一个NSMutableArray在过滤器打开时显示过滤的内容吗?或者我为每种不同类型的过滤器创建四个不同的NSMutableArrays,然后根据所在的过滤器显示该列表。
假设常见的实现是为列表安装一个NSArray,如果我要做四个不同的NSMutableArrays,或者如果取决于来自如果用户选择了哪个过滤器选项,我应该动态创建NSMutableArray,然后重新加载[tableView reloadData];
感谢。
答案 0 :(得分:2)
我没有在我面前展示该示例应用,但您通常会使用谓词进行过滤,因此查看docs on NSPredicate会对您有所帮助。
因此,当您想要更改过滤器时,可以通过更改谓词来实现。您不必创建所有筛选结果。您只能在任何特定时刻创建所需的那个。
使用数组,您可以使用shown in this example之类的代码进行过滤。关键线是
NSPredicate *predicate;
predicate = [NSPredicate predicateWithFormat:@"length == 9"];
NSArray *myArray2 = [myArray filteredArrayUsingPredicate:predicate];
并不总是使用数组进行过滤。如果使用核心数据,可以使用NSFetchedResultsControllers
完成。也以非常相同的方式使用谓词。谓词也可以用于其他事情,包括正则表达式过滤。如果你不熟悉它,那就值得一看。
答案 1 :(得分:1)
这取决于。如果您的基础数据位于核心数据中,请使用NSFetchedResultsController
并为其NSPredicate
提供。如果您有一个数据数组,最简单的方法是遍历它并创建另一个数据数组。
通常,过滤器本身不太可能像整个绘图过程一样昂贵(包括实例化或回收表格单元格)。您可以使用仪器轻松完成任务。
在内存方面保留四个不同的阵列通常不是一个好主意,这是一种稀缺资源。
无论如何,reloadData都会涉及到。 (根据操作系统版本,可能 - 请参阅NSFetchedResultsController
文档。)