NSSortDescriptor和NSPredicate进行sorting和筛选
我有一个tableView有5个不同的可能的数据源,取决于一个标志对象(NSNumber *)dataSourceAssignment
。 我已经实现了一个NSSortDescriptor
,通过(float)confidenceRating
dataSource
进行sorting。
数据源被分配后,我需要能够通过(NSString *)genre
过滤dataSource数组。 我知道如何使用NSPredicate
来过滤我的数组,但我不知道如何有效地做到这一点,当有5-6不同genre
string可以检查。
用户能够“检查”多个stream派,基本上根据select的stream派切换轨道的显示。 我正在考虑在NSUserDefaults *defaults
中创build一个字典,如下所示: ["genre1" = YES, "genre2" = NO, "genre3" = YES ...]
。
如何设置NSPredicate
以使用types字典过滤数据源,而无需使用带有条件负载的巨大if / switch语句。
这是我在执行NSPredicate
之前的代码:
- (void)assignDataSource { switch (dataSourceAssignment.intValue) { case 0: dataSource = [NSMutableArray arrayWithArray:tracksArray]; break; case 1: dataSource = [NSMutableArray arrayWithArray:favoriteTracks]; break; case 2: dataSource = [NSMutableArray arrayWithArray:topTracksOfTheWeek]; break; case 3: dataSource = [NSMutableArray arrayWithArray:topTracksOfTheMonth]; break; case 4: dataSource = [NSMutableArray arrayWithArray:topTracksOfTheYear]; break; default: break; } if (dataSourceAssignment.intValue >= 2) { NSSortDescriptor *avgRatingSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"confidenceRating" ascending:NO]; NSArray *sortDescriptors = [NSArray arrayWithObjects:avgRatingSortDescriptor, nil]; NSArray *sortedArray = [dataSource sortedArrayUsingDescriptors:sortDescriptors]; dataSource = [NSMutableArray arrayWithArray:sortedArray]; }
你可以存储哪些stream派被选入数组,然后使用谓词。 用户select/取消select元素时,也可以删除/添加元素。
NSArray *selectedGenresByUser = [NSArray arrayWithObjects:@"genre1",@"genre2", nil]; NSPredicate *predicate = [NSPredicate predicateWithFormat: @"genre in $SELECTED_GENRES"]; predicate = [predicate predicateWithSubstitutionVariables:[NSDictionary dictionaryWithObject:[NSArray arrayWithArray:selectedGenresByUser] forKey:@"SELECTED_GENRES"]]; //then use predicate to filter datasource array( maby you can store all elements in one array)
当使用predicateWithFormat
,可以传递一个关于谓词的正则expression式语句。 那个string就是你可以做多个谓词的地方,所以当你select不同的types的时候,你可以改变它。
例如,如果用户select了genre1和genre2,则可以具有: predicateWithFormat:predicateString
,然后将predicateString
设置为沿着"SELF beginswith genre1 AND SELF beginswith genre1"
的行。 虽然肯定会重复检查我使用的正则expression式,因此您需要一些比它更好的工具。