0

在我的应用程序中,我有一个包含大约 20.000 个项目的大表。我在tableview上显示它。但是在进行动态搜索时搜索栏太慢了。我读过 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];
        }
    }
 }

我必须在哪里插入 NSPredicate 到我们的“for”中?

4

2 回答 2

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 回答
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 来修改运算符,以分别指定不区分大小写和变音符号。例子[NSPredicate predicateWithFormat:@"name contains[cd] %@", searchString];

于 2012-04-18T10:37:01.887 回答