2013-12-24 2 views
0

У меня есть методПроверка существования множества элементов согласования сказуемого

- (BOOL)isLockedDueToSamples 
{ 
    if ([self.samples count] > 0) 
    { 
     NSPredicate* p = [NSPredicate predicateWithFormat:@"appraised == YES OR analysed == YES"]; 
     if ([[self.samples filteredSetUsingPredicate:p] count] > 0) 
      return YES; 
    } 
    return NO; 
} 

Этот метод должен быть вызван довольно часто, но довольно медленно, поскольку self.samples может быть до 1500. Есть ли метод для проверки существование набора элементов, соответствующих предикату, без необходимости фильтровать весь набор?

EDIT:

Я сумел сделать метод немного быстрее, как это

- (BOOL)isLockedDueToSamples 
{ 
    if ([self.samples count] > 0) 
    { 
     for (Sample *sample in self.samples) 
     { 
      if (sample.appraised || sample.analysed) 
      { 
       return YES; 
      } 
     } 
    } 
    return NO; 
} 
+0

Вы можете попробовать объектыPassingTest :, но я не думаю, что это будет быстрее, чем ваш цикл. – rdelmar

ответ

0

Если производительность является проблемой, вы можете сделать фильтрацию асинхронно, или использовать NSSet «s objectsPassingTest: метод, передавая ему блок, чтобы проверить на, и остановится, если/когда вы встречаетесь положительный тест:

- (BOOL)isLockedDueToSamples 
{ 
    NSSet* matches = [self.samples objectsPassingTest:^(id sample, BOOL* stop){ 
     if (sample.appraised || sample.analysed) { 
      *stop = YES; 
      return YES; 
     } 
    }]; 

    return [matches count] > 0; 
} 

Edit:

Я не верю, что это будет быстрее, чем ваш цикл.

Смежные вопросы