1

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

私の質問は2つあります:

  • 検索プロセスを高速化するにはどうすればよいですか?
  • 検索がメインスレッドをブロックしないようにするにはどうすればよいですか?つまり、ユーザーがそれ以上文字を入力できないように停止します。

2番目の部分では、「performSelector:withObject:afterDelay:」と「cancelPreviousPerformRequests ...」を試しましたが、あまり成功しませんでした。代わりにスレッドを使用する必要があると思いますが、あまり経験がありません。

4

2 に答える 2

1

回答:「検索プロセスを高速化するにはどうすればよいですか?」

テーブルでコアデータの結果を使用していることがわかります。したがって、コアデータにフィルタリングを行わせる方がよいでしょう。

したがって、フィルタリングにNSPredicateを使用して、新しいfetchedResultControllerを作成します。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", searchText];
[fetchRequest setPredicate:predicate];

=の代わりにMATCHESを使用すると、正規表現の比較を定義できます(大文字と小文字を区別しない比較の場合)

于 2011-02-10T14:03:52.650 に答える
0

メインスレッドをブロックしないように、NSOperationとして検索を行うことになりました。私もラインハルトが提案して使用したようにしたfetchedResultController

アップルデベロッパサイトのNSOperationsに本当に良いビデオがあります。思い出すと、私はAdvanced iPhonepart1のようなものと呼ばれていました。

于 2011-03-10T20:30:13.800 に答える