2012-08-02 135 views
0

我有一个tableView有5个不同的可能的数据源,取决于标志对象(NSNumber *)dataSourceAssignment。我实施了NSSortDescriptor,将dataSource排序为(float)confidenceRatingNSSortDescriptor和NSPredicate进行排序和过滤

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

用户能够“检查”多种流派,基本上应根据选择的流派切换曲目的显示。我正在考虑在NSUserDefaults *defaults中创建一个字典,如下所示:["genre1" = YES, "genre2" = NO, "genre3" = YES ...]

如何设置NSPredicate以使用类型字典过滤数据源,而不使用带有条件负载的巨大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]; 
} 

回答

1

您可以存储哪些流派被选入数组,然后使用谓词。 当用户选择/取消选择元素时,您还可以删除/添加元素。

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) 
1

当您使用predicateWithFormat,你可以通过它正则表达式语句关于谓语。该字符串是您可以执行多个谓词的位置,因此可以是在选择不同类型时您所做的更改。

例如,如果用户选择了genre1和genre2,则可以有:predicateWithFormat:predicateString,然后将predicateString设置为沿着"SELF beginswith genre1 AND SELF beginswith genre1"的行。虽然肯定会重复检查我使用的正则表达式,因此您需要一些比它更好的工具。