2012-04-18 3 views
0

제 애플리케이션에는 약 20.000 개의 대형 테이블이 있습니다. 나는 그것을 tableview에 표시하고있다. 그러나 동적 검색을 수행하는 동안 검색 막대가 너무 느립니다. 나는 NSPredicate 방법이 고성능이어서 NSRange라는 것을 읽었습니다. 이 방법을 어떻게 적용 할 수 있을지 모르겠습니다.nspredicate를 사용한 빠른 연구

내 코드는 다음과 같습니다

- (void)filterContentForSearchText:(NSString*)searchText 
{ 
    [self.filteredListContent removeAllObjects]; 

    for (Book *book in listContent) 
    { 
     NSRange range = [book.name rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
     // is very very slow 
     if (range.location != NSNotFound) 
     { 
      [self.filteredListContent addObject:book]; 
     } 
    } 
} 

난 자 NSPredicate,에 우리 밖으로 "에 대한"을 삽입해야합니다 어디?

답변

2
- (void)filterContentForSearchText:(NSString*)searchText 
{ 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains %@", searchText ]; 
    self.filteredListContent = [NSMutableArray arrayWithArray:[listContent filteredArrayUsingPredicate:predicate]]; 
} 
+0

aswer에 대한 Thk, 어디에서이 코드를 푸시합니까? "for"주기에? –

+0

루프 대신. 이것은 루프를 대체합니다. – ssteinberg

+0

알았어. 근데 내가 책을 관리해? @ "book.name에 % @"가 포함되어 있습니다. 맞습니까? –

2

당신이 요청 사용을 가져올 수 있도록하려는 경우 예를 NSArray를 필터링, 당신은

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"job == 'Programmer'"] 
[listOfItems filterUsingPredicate:predicate]; 

를 사용할 수있는 경우

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@", aTitle]; 
[request setEntity:[NSEntityDescription entityForName:@"DVD" inManagedObjectContext:moc]]; 
[request setPredicate:predicate]; 

NSError *error = nil; 
NSArray *results = [moc executeFetchRequest:request error:&error]; 
// error handling code 
[request release]; 

편집 :

ssteinberg의 예는 간단하고 좋은, 단지 하나의 노트 - 당신은 연산자를 수정할 수 있습니다 키 문자 c와 d를 사용하여 대괄호 t o 대소 문자 구분 및 분음 기호 구분을 각각 지정합니다. 예 [NSPredicate predicateWithFormat:@"name contains[cd] %@", searchString];