2011-10-26 17 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

首先,你为什么要消除循环?你认为它会跑得更快吗?如果是这样,为什么?运行几个简单的谓词可能与运行一个复杂的谓词一样快。其次,你不能按照你提出的方式来组合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