0

私のアプリケーションでは、約 20.000 アイテムの大きなテーブルがあります。テーブルビューで表示しています。しかし、動的検索を行っている間は検索バーが遅すぎます。NSPredicate メソッドは NSRange よりもパフォーマンスが高いと読みました。この方法を適用する方法がわかりません。

私のコードは次のとおりです。

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

「for」のどこに NSPredicate を挿入する必要がありますか?

4

2 に答える 2

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 の例はシンプルで適切です。1 つだけ注意してください。大括弧内のキー文字 c と d を使用して演算子を変更し、それぞれ大文字と小文字を区別しないように指定できます。例[NSPredicate predicateWithFormat:@"name contains[cd] %@", searchString];

于 2012-04-18T10:37:01.887 に答える
2
- (void)filterContentForSearchText:(NSString*)searchText
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains %@", searchText ];
    self.filteredListContent  = [NSMutableArray arrayWithArray:[listContent filteredArrayUsingPredicate:predicate]];
}
于 2012-04-18T10:35:34.477 に答える