2012-04-24 4 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)과 같은 것입니다. 나는 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]]; 
} 

이것은 원래의 방법보다 훨씬 더 효율적입니다. categories 또는 categoryIDs은 largish입니다.

+0

감사합니다. 그러나 메소드의 서명이 변경 되었기 때문에 우리에게는 적용 할 수 없습니다. – Simon

+0

@Simon : 그것은 새로운 방법이므로 서명을 변경하지 않습니다. 그러나 내 대답을 약간 수정하여 도움을 드리겠습니다. – JeremyP

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

이렇게하면 내가 생각하는대로 할 수 있습니다. 카테고리 ID가 float라고 가정합니다. NSLog에서와 같이 필요에 따라 % f를 변경하십시오.

관련 문제