我有一个类别数组和另一个类别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加速我的阵列搜索?
答案 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]];
}
如果categories
或categoryIDs
较大,这仍然比原始方法更有效。
答案 2 :(得分:0)
NSPredicate* searchPredicate = [NSPredicate predicateWithFormat:@"categoryID == %f", categoryID];
NSArray *categoriesWithIDs =[categories filteredArrayUsingPredicate:searchPredicate];
return categoriesWithIDs;
这就是你想做你想做的事情。假设类别id是浮点数。根据需要更改%f,就像使用NSLog一样。