NSSortDescriptor和NSPredicate用于排序和过滤 [英] NSSortDescriptor and NSPredicate for sorting and filtering

查看:78
本文介绍了NSSortDescriptor和NSPredicate用于排序和过滤的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆