2

ユーザーが名前を入力すると、候補のテーブル ビューを表示するテキスト フィールドがあります。データ ソースのフィルター処理は、時間がかかることがあるため、バックグラウンド スレッドで行われます。

- (IBAction)personNameChanged:(UITextField *)sender
{
    NSString *name = sender.text;

    [backgroundThread performBlock:^{
            [self.personsDataSource filterDataSourceByName:name];
            [mainThread performBlock:^{
                [self.autoCompleteTableView reloadData];
            }];
    }];
}

[UITableView reloadData]呼び出し:

  • -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

...同期的にすべてのセル:

  • - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

...後で呼び出されます。

問題は、ユーザーがすばやく入力しているときに、filterDataSourceByNameすべてのセルが読み込まれる前に呼び出される可能性があることです。次にcellForRowAtIndexPath、存在しない indexPath に対して呼び出されます。

reloadData の呼び出しが速すぎて、最後のリロードからすべてのセルがロードされていない場合、この問題をどのように解決する必要がありますか?

4

1 に答える 1

8

テーブル ビューの新しいデータ ソース配列の割り当ても、次のようにメイン スレッドで行う必要があります。

- (IBAction)personNameChanged:(UITextField *)sender
{
    NSString *name = sender.text;
    [backgroundThread performBlock:^{
            // Store filtered array into separate array here:
            NSArray *filteredPersons = [self.personsDataSource filterDataSourceByName:name];
            [mainThread performBlock:^{
                // Assign to table view data source array here:
                self.dataSourceArray = filteredPersons;
                [self.autoCompleteTableView reloadData];
            }];
    }];
}

そうしないと、メイン スレッドのテーブル ビューによってアクセスされているときに、データ ソース配列がバックグラウンド スレッドで変更される可能性があります。

于 2013-04-04T13:11:56.460 に答える