Упрощение проверки строк из массива в NSPredicate - PullRequest
0 голосов
/ 26 октября 2011

Для службы синхронизации я пытаюсь сократить как можно больше циклов, используя предикаты.

В настоящее время у меня есть что-то вроде этого:

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];

Есть идеи?Большое спасибо за любой вклад!

1 Ответ

2 голосов
/ 27 октября 2011

Прежде всего, почему вы хотите устранить цикл?Как вы думаете, он будет работать быстрее?Если так, то почему?Запуск нескольких простых предикатов может быть таким же быстрым, как запуск одного сложного предиката.

Во-вторых, вы не можете комбинировать 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];
...