我有一个包含超过3000个条目的表,搜索速度非常慢。
目前,我正在执行“TableSearch”示例代码(但没有范围)
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText: searchString];
// Return YES to cause the search result table view to be reloaded.
return YES;
}
filterContentForSearchText方法如下:
- (void) filterContentForSearchText:(NSString*)searchText
{
// Update the filtered array based on the search text
// First clear the filtered array.
[filteredListContent removeAllObjects];
// Search the main list whose name matches searchText
// add items that match to the filtered array.
if (fetchedResultsController.fetchedObjects)
{
for (id object in fetchedResultsController.fetchedObjects)
{
NSString* searchTarget = [tableTypeDelegate getStringForSearchFilteringFromObject:object];
if ([searchTarget rangeOfString:searchText
options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)].location != NSNotFound)
{
[filteredListContent addObject:object];
}
}
}
}
我的问题有两个:
对于第二部分,我尝试了“performSelector:withObject:afterDelay:”和“cancelPreviousPerformRequests ...”但没有取得多大成功。我怀疑我需要使用线程,但我没有太多经验。
答案 0 :(得分:1)
回答:“我怎样才能更快地完成搜索过程?”
您正在使用表中的核心数据结果。因此,最好让核心数据为您进行过滤。
因此,使用NSPredicate创建一个新的fetchedResultController进行过滤。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", searchText];
[fetchRequest setPredicate:predicate];
使用MATCHES而不是=让你定义一个正则表达式比较(用于不区分大小写的比较)
答案 1 :(得分:0)
我最终以NSOperation进行搜索,以免阻塞主线程。我也喜欢Reinhard建议并使用fetchedResultController
。
苹果开发者网站上有关于NSOperations的非常好的视频。如果我记得,我被称为高级iPhone第1部分。