NSSortDescriptor和NSPredicate用于排序和过滤 [英] NSSortDescriptor and NSPredicate for sorting and filtering
问题描述
我有一个tableView,它具有5个可能的数据源,具体取决于标志对象(NSNumber *)dataSourceAssignment
.我已经实现了一个NSSortDescriptor
,该NSSortDescriptor
由(float)confidenceRating
排序.
I have a tableView that has 5 different possible datasources depending on a flag object (NSNumber *)dataSourceAssignment
. I've implemented an NSSortDescriptor
that sorts dataSource
by a (float)confidenceRating
.
分配数据源后,我需要能够通过(NSString *)genre
过滤dataSource数组.我了解如何使用NSPredicate
来过滤数组,但是当可以检查5-6个不同的genre
字符串时,我无法弄清楚如何有效地执行此操作.
After the datasource is assigned, I need to be able to filter the dataSource array by a (NSString *)genre
. I understand how to use NSPredicate
to filter my array, but I can't figure out how to do it efficiently when there are 5-6 different genre
strings that could be checked.
用户可以检查"多种类型,基本上应该根据选择的类型切换曲目的显示.我正在考虑在NSUserDefaults *defaults
中创建一个看起来像这样的字典:["genre1" = YES, "genre2" = NO, "genre3" = YES ...]
.
The user is able "check" multiple genres that should basically toggle the display of tracks according to which genres are selected. I was thinking of creating a dictionary in NSUserDefaults *defaults
that would look something like this: ["genre1" = YES, "genre2" = NO, "genre3" = YES ...]
.
如何设置NSPredicate
以使用流派字典过滤数据源,而不使用带有大量条件的巨大if/switch语句.
How can I set up NSPredicate
to filter datasource using the genre dictionary without using a huge if/switch statement with loads of conditions.
这是实现NSPredicate
之前我拥有的代码:
Here is the code I have before a NSPredicate
is implemented:
- (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];
}
推荐答案
您可以将选择了哪些流派存储到数组中,然后使用谓词. 您还可以在用户选择/取消选择元素时删除/添加元素.
You can store which genres were selected into array and then use predicate. You can also remove/add elements when user select/deselect elements.
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)
这篇关于NSSortDescriptor和NSPredicate用于排序和过滤的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!