NSSortDescriptor和NSPredicate进行sorting和筛选

我有一个tableView有5个不同的可能的数据源,取决于一个标志对象(NSNumber *)dataSourceAssignment 。 我已经实现了一个NSSortDescriptor ,通过(float)confidenceRating dataSource进行sorting。

数据源被分配后,我需要能够通过(NSString *)genre过滤dataSource数组。 我知道如何使用NSPredicate来过滤我的数组,但我不知道如何有效地做到这一点,当有5-6不同genrestring可以检查。

用户能够“检查”多个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式,因此您需要一些比它更好的工具。