2012-04-24 6 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; 
} 

私は知っています。だから、私がしたいのはSELECT * FROM categories WHERE categories.categoryID in (categoryIDs)のようなものです。私はNSPredicateがそのようなことを表現する客観的な方法だと思っていますが、私はそれが私がしたいことをする方法を知らない。 NSPredicateで配列検索を高速化するにはどうすればよいですか?

答えて

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

私はそれがどんなに速くなるかもわかりません。基本的には、コードと同じ種類のことを実行し、述語を構築する必要があります。

あなたはcategoryIDsからNSSetを作り、-containsObject:を使用して代わりにcategoryIDsをループして、手動で-isEqual:を呼び出すことによって、あなたのコードを向上させることができます。

1

あなたの古い方法を継続して使用する場合は、編集

私は述語のことについてはよく分からないが、即時の最適化が

- (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; 
} 

セットでお使いのカテゴリIDを置くことで、このように変更してください:

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

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

これは、元の方法よりもずっと効率的です。categoriesまたはcategoryIDsは大です。

+0

ありがとうございます - それはメソッドのシグネチャを変更するので、私たちのためには機能しません。 – Simon

+0

@Simon:それは新しい方法なので、署名を変更していません。しかし、私は私の答えを少し修正するつもりです。 – JeremyP

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

これは、私が思うようにする方法です。カテゴリidがfloatであると仮定します。 NSLogと同じように%fを必要に応じて変更してください。