2011-10-26 6 views
0

同期サービスでは、述語を使ってできるだけ多くのループを減らそうとしています。NSPredicateの配列からの文字列検査の簡略化

私は現在、このようなものがあります:

for (NSString *filterOutPath in toFilterOutPaths) { 
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"NOT (href CONTAINS %@)", filterOutPath]; 
    toUpdateFiles = [toUpdateFiles filteredArrayUsingPredicate:pred]; 
} 

私はもっとこのような何かを目指しています:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"NOT (href CONTAINS (ANY IN %@))", toFilterOutPaths]; 
toUpdateFiles = [toUpdateFiles filteredArrayUsingPredicate:pred]; 

任意のアイデア?ご協力ありがとうございました!

答えて

2

まず、なぜループを排除したいのですか?あなたはそれがより速く走ると思いますか?もしそうなら、なぜですか?いくつかの単純な述部を実行することは、1つの複雑な述部を実行するのと同じくらい速いことがあります

第2に、CONTAINS、ANY、INを提案方法で組み合わせることはできません。代わりに、次のような複合述語を作成することができます。

NSMutableArray *predicates = [NSMutableArray arrayWithCapacity:toFilterOutPaths.count]; 

for (NSString *filterOutPath in toFilterOutPaths) { 
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"NOT (href CONTAINS %@)", filterOutPath]; 
    [predicates addObject:predicate]; 
} 

NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicates]; 

toUpdateFiles = [toUpdateFiles filteredArrayUsingPredicate:compoundPredicate]; 
+0

ありがとう、私は複合述語を考えていません。 – zwaldowski

関連する問題