我有一个uitableview和uisearchbar。我用大量的记录绑定表,并为用户提供功能,可以从中搜索。但很多时候,当数据大小很大时,键盘会停止工作,重新加载表格。无论如何,我可以异步搜索。它是iOS 4应用程序。
我的uisearchbar textDidChange方法如下
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
if(searchText.length == 0)
{
isFiltered = FALSE;
}
else
{
@autoreleasepool {
isFiltered = true;
membersMFilterArray = [[NSMutableArray alloc] init];
int lineCount = [[[membersMArray objectAtIndex:0] valueForKey:@"LineCount"] intValue];
NSString *membersMArrayValue;
for (int i=0; i<[membersMArray count]; i++)
{
membersMArrayValue = [membersMArray objectAtIndex:i];
NSString *line;
for (int j=0; j<lineCount; j++)
{
line = [NSString stringWithFormat:@"Line%d",j+1];
NSRange lineRange = [[membersMArrayValue valueForKey:line] rangeOfString:searchText options:NSCaseInsensitiveSearch];
if(lineRange.location != NSNotFound)
{
[membersMFilterArray addObject:[membersMArray objectAtIndex:i]];
break;
}
}
}
}
}
[tblMember reloadData];}
我的数组如下所示,实际上这是一个用户数据,它出现在一个表行中,如果有10000行,则乘以此数据。因此,我认为上面的循环是因为这种方式。
(
{
Line1 = "Ashish";
Line10 = "Ahmedabad";
Line11 = "Gujarat";
Line12 = "";
Line13 = "India";
Line14 = "";
Line15 = "";
Line16 = "abc@yahoo.com";
Line17 = "";
Line18 = "";
Line19 = "xyz";
Line2 = "Ahmedabad, Gujarat";
Line20 = "Jun 04, 2012";
Line3 = "";
Line4 = "";
Line5 = "";
Line6 = "abc";
Line7 = "xyz";
Line8 = "";
Line9 = "";
LineCount = 20;
"Member_id" = GM00018004;
RowNo = 01;
}
)
答案 0 :(得分:0)
简短的回答是肯定的。您可以使用Grand Central Dispatch异步执行搜索。然后,您可以通知表视图的数据源以进行更新。
但是,让搜索更有效并实现可接受的实时更新会更好。如何实现这一点取决于数据的存储和索引方式。例如,如果您正在使用Core Data,则必须调整NSFetchedResultsController,并且可能构造一个新实体,在您要搜索的较长字符串中出现单个字符串。
查看搜索代码,您有两个嵌套循环 - 几乎可以确定性能下降的方法。也许您应该考虑一些Apple的自动迭代机制(仍然有迭代,但在幕后),例如使用键路径或谓词。例如,像:
resultArray = [membersArray filteredArrayUsingPredicate:
[NSPredicate predicateWithFormat:@"self CONTAINS[cd] %@", searchText]];
答案 1 :(得分:0)
从您的代码中,我认为两个for循环是不必要的。使用更好的概念对数组项进行排序。
我的一些建议是加速。
Remove the auto-release-pool
Use one for-loop instead of two
你可以看看 start&amp;执行结束时间使用NSlog。发现时间并修复它。
示例:强>
NSLog(@"loop1 started now")
for (int i=0; i<[membersMArray count]; i++)
{
membersMArrayValue = [membersMArray objectAtIndex:i];
NSString *line;
for (int j=0; j<lineCount; j++)
{
NSLog(@"loop2 started now")
line = [NSString stringWithFormat:@"Line%d",j+1];
NSRange lineRange = [[membersMArrayValue valueForKey:line] rangeOfString:searchText options:NSCaseInsensitiveSearch];
if(lineRange.location != NSNotFound)
{
[membersMFilterArray addObject:[membersMArray objectAtIndex:i]];
break;
}
}
NSLog(@"loop2 ended now")
}
NSLog(@"loop1 ended now")