0

私はuitableviewとuisearchbarを持っています。私は大量のレコードでテーブルをバインドしており、ユーザーがそこから検索できる機能を提供しています。しかし、データサイズが大きい場合、キーボードがテーブルをリロードするまでスタックすることがよくあります。とにかく非同期で検索できるのでしょうか。iOS4アプリです。

ここに画像の説明を入力してください

私のuisearchbartextDidChangeメソッドは次のとおりです

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

私の配列は以下のとおりです。実際には、これは1つのテーブル行に到着する1つのユーザーデータであり、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 を微調整する必要があり、検索対象の長い文字列に出現する単語の単一文字列を含む新しいエンティティを作成する必要があります。

検索コードを見ると、ネストされたループが 2 つあります。これは、パフォーマンス低下のほぼ確実な原因です。おそらく、キーパスや述語など、Apple の自動反復メカニズム (まだ反復がありますが、舞台裏で行われます) のいくつかを検討する必要があります。たとえば、次のようなものです。

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

あなたのコードから、 2 つの 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 に答える