2012-08-02 136 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"的行。雖然肯定會重複檢查我使用的正則表達式,因此您需要一些比它更好的工具。