2012-04-18 50 views
0

在我的应用程序中,我有一个大约20,000个项目的大表。我在桌面上显示它。但搜索栏在进行动态搜索时速度太慢。我已经读过,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,我推这个代码?进入“换”周期? – 2012-04-18 10:52:35

+0

而不是循环。这取代了循环。 – ssteinberg 2012-04-18 10:53:58

+0

好的,但我管理对象书? @“book.name包含%@”,是吗? – 2012-04-18 10:56:41

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来修改操作符o分别指定病例和变音不敏感性。示例[NSPredicate predicateWithFormat:@"name contains[cd] %@", searchString];