2012-04-18 3 views
0

私のアプリケーションでは、私は約20,000アイテムの大きなテーブルを持っています。私はそれをtableviewに表示しています。しかし、検索バーは動的検索を実行するには遅すぎます。私はNSPredicateメソッドが高性能でNSRangeであることを読んだ。 このメソッドをどのようにapplicateするのか分かりません。nspredicateで高速リサーチ

私のコードは次のとおりです。私は私たちのうち "について" に、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]; 
     } 
    } 
} 

答えて

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

アスカーのためのThk、ここで私はこのコードを押しますか? "for"サイクルに入りますか? –

+0

ループの代わりに。これはループを置き換えます。 – ssteinberg

+0

[OK]を、しかし私はオブジェクトの本を管理しますか? @ "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]; 

EDIT:

ssteinbergの例は簡単で、良い、ちょうど1つの音符 - あなたは、角カッコ内のキー文字cとdを使用して演算子を変更することができますそれぞれ大文字と小文字区別区別を指定します。例[NSPredicate predicateWithFormat:@"name contains[cd] %@", searchString];