2012-04-24 62 views
0

我有一個類別數組,和另一個類別ID數組。我想抽出具有匹配ID的類別。目前,我的代碼看起來有點像這樣:如何使用NSPredicate加速我的數組搜索?

- (NSArray *)categoriesFromArray:(NSArray *)categories withIDs:(NSArray *)categoryIDs { 
    NSMutableArray *categoriesWithIDs = [NSMutableArray array]; 

    for (SGBCategory *category in categories) { 
     for (NSNumber *categoryID in categoryIDs) { 
      if ([category.categoryID isEqual:categoryID]) { 
       [categoriesWithIDs addObject:category]; 
       break; 
      } 
     } 
    } 

    return categoriesWithIDs; 
} 

Ewww,我知道。所以我想要做的就是像SELECT * FROM categories WHERE categories.categoryID in (categoryIDs)這樣的SQL。我認爲NSPredicate是表達這種事情的客觀方式,但我不知道如何讓它做我想做的事情。如何使用NSPredicate加速我的數組搜索?

回答

2
return [categories filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"categoryID IN %@", categoryIDs]]; 

但我不知道它會更快。它基本上必須和你的代碼做類似的事情,再加上建立一個謂詞。

您可以通過從categoryIDs製造NSSet和使用-containsObject:,而不是循環在categoryIDs和手動調用-isEqual:提高你的代碼。

1

我不知道謂詞的事情,但立即優化是把你的類別ID在一組

- (NSArray *)categoriesFromArray:(NSArray *)categories withIDsFromSet:(NSSet *)categoryIDs { 
    NSMutableArray *categoriesWithIDs = [NSMutableArray array]; 

    for (SGBCategory *category in categories) { 
     if ([categoryIDS containsObject: [category categoryID]]) 
     { 
      [categoriesWithIDs addObject:category]; 
     } 
    } 
    return categoriesWithIDs; 
} 

編輯

如果您希望繼續使用舊的方法,如此修改:

- (NSArray *)categoriesFromArray:(NSArray *)categories withIDs:(NSArray *)categoryIDs { 

    return [self categoriesFromArray: categories withIDsFromSet: [NSSet setWithArray: categoryIDs]]; 
} 

這仍然會比您提供的原始方法更有效率categoriescategoryIDs是比較大的。

+0

謝謝 - 雖然這改變了方法的簽名,所以它對我們來說不可行。 – Simon 2012-04-24 10:34:16

+0

@Simon:這是一種新方法,所以它不會改變簽名。不過,我會稍微修改我的答案以幫助。 – JeremyP 2012-04-24 10:38:22

0
NSPredicate* searchPredicate = [NSPredicate predicateWithFormat:@"categoryID == %f", categoryID]; 
    NSArray *categoriesWithIDs =[categories filteredArrayUsingPredicate:searchPredicate]; 
    return categoriesWithIDs; 

這就是你將如何做你想做的事。假設類別id是一個浮點數。根據需要更改%f,就像使用NSLog一樣。