使用uisearchbar在uitableview中搜索时键盘卡住...?

时间:2012-11-09 08:16:31

标签: iphone uitableview uisearchbar

我有一个uitableview和uisearchbar。我用大量的记录绑定表,并为用户提供功能,可以从中搜索。但很多时候,当数据大小很大时,键盘会停止工作,重新加载表格。无论如何,我可以异步搜索。它是iOS 4应用程序。

enter image description here

我的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;
}

2 个答案:

答案 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")