0

カテゴリの配列と、カテゴリIDの別の配列があります。IDが一致するカテゴリを引き出したい。現時点では、私のコードは次のようになっています。

- (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は、そのようなことを表現するObjective-cの方法だと思いますが、自分がやりたいことを実行する方法がわかりません。NSPredicateを使用して配列検索を高速化するにはどうすればよいですか?

4

3 に答える 3

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

でも、もっと速くなるかどうかはわかりません。基本的には、コードと同じ種類のことを実行し、さらに述語を作成する必要があります。

をループして手動で呼び出す代わりに、NSSetからを作成してcategoryIDsを使用することで、コードを改善できます。-containsObject:categoryIDs-isEqual:

于 2012-04-24T10:03:30.093 に答える
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]];
}

これは、提供されている元の方法よりもはるかに効率的であるか、categoriesまたはcategoryIDs大規模です。

于 2012-04-24T10:24:56.153 に答える
0
NSPredicate* searchPredicate = [NSPredicate predicateWithFormat:@"categoryID == %f", categoryID];
    NSArray *categoriesWithIDs =[categories filteredArrayUsingPredicate:searchPredicate];
    return categoriesWithIDs;

これはあなたが私が思うことをあなたがしたいことをする方法です。カテゴリIDがfloatであると仮定します。NSLogの場合と同様に、必要に応じて%fを変更します。

于 2013-04-14T09:51:42.740 に答える