如何使用NSPredicate加速我的阵列搜索?

时间:2012-04-24 09:42:28

标签: objective-c nspredicate

我有一个类别数组和另一个类别ID数组。我想提取具有匹配ID的类别。目前,我的代码看起来有点像这样:

- (NSArray *)categoriesFromArray:(NSArray *)categories withIDs:(NSArray *)categoryIDs {
    NSMutableArray *categoriesWithIDs = [NSMutableArray array];

    for (SGBCategory *category in categories) {
        for (NSNumber *categoryID in categoryIDs) {
            if ([category.categoryID isEqual:categoryID]) {
                [categoriesWithIDs addObject:category];
                break;
            }
        }
    }

    return categoriesWithIDs;
}
我知道,Ewww。所以我想做的就像SELECT * FROM categories WHERE categories.categoryID in (categoryIDs)在SQL中做的那样。我认为NSPredicate是表达这类事物的客观方式,但我不知道如何让它做我想做的事。如何使用NSPredicate加速我的阵列搜索?

3 个答案:

答案 0 :(得分:2)

return [categories filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"categoryID IN %@", categoryIDs]];
但是,我不知道它会更快。它基本上必须做与代码相同的事情,并构建一个谓词。

您可以通过NSSet categoryIDs并使用-containsObject:而不是循环categoryIDs并手动调用-isEqual:来改善您的代码。< / p>

答案 1 :(得分:1)

我不确定谓词的事情,但立即优化是将你的类别ID放在一个集合中

- (NSArray *)categoriesFromArray:(NSArray *)categories withIDsFromSet:(NSSet *)categoryIDs {
    NSMutableArray *categoriesWithIDs = [NSMutableArray array];

    for (SGBCategory *category in categories) {
        if ([categoryIDS containsObject: [category categoryID]])
        {
            [categoriesWithIDs addObject:category];
        }
    }
    return categoriesWithIDs;
}

修改

如果您想继续使用旧方法,请进行修改:

- (NSArray *)categoriesFromArray:(NSArray *)categories withIDs:(NSArray *)categoryIDs {

    return [self categoriesFromArray: categories withIDsFromSet: [NSSet setWithArray: categoryIDs]];
}

如果categoriescategoryIDs较大,这仍然比原始方法更有效。

答案 2 :(得分:0)

NSPredicate* searchPredicate = [NSPredicate predicateWithFormat:@"categoryID == %f", categoryID];
    NSArray *categoriesWithIDs =[categories filteredArrayUsingPredicate:searchPredicate];
    return categoriesWithIDs;

这就是你想做你想做的事情。假设类别id是浮点数。根据需要更改%f,就像使用NSLog一样。