0

我有一个 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 行,则与此相乘。所以上面的for循环是我认为是因为这种方式。

(
    {
    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;
}

)

4

2 回答 2

0

简短的回答是肯定的。您可以使用Grand Central Dispatch异步执行搜索。然后,您可以通知表视图的数据源进行更新。

但是,让您的搜索更高效并实现可接受的实时更新会更好。如何实现这一点,取决于您的数据是如何存储和索引的。例如,如果您使用 Core Data,您将不得不调整您的 NSFetchedResultsController 并且可能构建一个新实体,其中包含在要搜索的较长字符串中出现的单个单词字符串。

查看您的搜索代码,您有两个嵌套循环 - 几乎可以肯定会导致性能下降。也许您应该考虑一些 Apple 的自动迭代机制(仍有迭代,但在幕后),例如使用关键路径或谓词。例如,类似:

resultArray = [membersArray filteredArrayUsingPredicate:
   [NSPredicate predicateWithFormat:@"self CONTAINS[cd] %@", searchText]];
于 2012-11-09T08:24:52.497 回答
0

从您的代码中,我认为这两个 for 循环是不必要的。使用更好的概念对数组项进行排序。

我的一些建议可以加快速度。

Remove the auto-release-pool     
Use one for-loop instead of two

您可以使用 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")
于 2012-11-09T08:58:12.903 回答