2013-12-24 28 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是否有檢查的技術是否存在與謂詞相匹配的集合元素,而不必過濾整個集合?

編輯:

我已經成功地使該方法稍快,這樣

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

你可以嘗試objectsPassingTest :,但我不認爲這會比你的循環更快。 – rdelmar

回答

0

如果性能是一個問題,你可以做過濾異步,或使用NSSetobjectsPassingTest:方法,傳遞一個塊進行測試,並停止,如果/當你遇到一個積極的測試:

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

    return [matches count] > 0; 
} 

編輯:

但我不認爲這會比你的for循環更快。