4

NSPredicate で NSArray をフィルター処理し、フィルター処理された配列を UITableView に使用しています。ユーザーが UITextField にテキストを入力するときに、このフィルタリングを使用しています。したがって、UITextField のテキストが変更されるたびに、フィルター関数を呼び出しています。

次のようになります。

NSArray *hugeArray = ...;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", input];
_resultArray = [hugeArray filteredArrayUsingPredicate:predicate];
[_myTableView reloadData];

多くのオブジェクトで NSArray を使用すると、入力が非常に遅くなります (UI での完全な入力が遅くなります)。パフォーマンスを向上させたり、フィルタリングされたコマンドをバックグラウンドで実行したりする可能性はありますか?

UITextField への書き込みはブロックされるべきではありません。入力後すぐに UITableView が更新される場合は、問題ない可能性があります。

4

3 に答える 3

1

それでも述語を使用したい場合、およびオブジェクトの順序が重要でない場合 (オブジェクトのインデックスは重要ではないことを意味します) は、 に変換できNSArrayますNSSetセットのフィルタリング ( を使用NSPredicate) は、配列 よりもはるかに高速です

NSSet *hugeSet = [NSSet setWithArray:hugeArray]
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", input];
NSSet *filteredSet = [hugeSet filteredSetUsingPredicate: predicate];

Apple ドキュメントの NSSet と NSArray と NSDictionary の詳細

于 2016-01-11T14:53:14.300 に答える
0

バックグラウンドで実行することが解決策だと思います。別のキューでクエリを実行してから、メイン キューにテーブルをリロードします。GCDを使用すると、次のようになります...

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", input];
        _resultArray = [hugeArray filteredArrayUsingPredicate:predicate];

          dispatch_async(dispatch_get_main_queue(), ^{
                [_myTableView reloadData];
          });
    });
于 2012-12-08T21:53:21.003 に答える