0

ディスパッチメカニズムを利用してコンテンツをバックグラウンドで取得し、取得したらテーブルビューを更新しようとしていますが、そのようなメカニズムは機能しますが、リロードするとテーブルビューセルはクリックできなくなります。[self._tableView reloadData] を削除すると、クリック可能になります。以下は私のコードです。助言がありますか?

NSString *const cellIdentifier = @"AutoFill";    
    UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

dispatch_async(queue, ^{
    NSString *te = [tableData objectAtIndex:indexPath.row];
    NSArray *a = [te componentsSeparatedByString:@" "];

    dispatch_sync(dispatch_get_main_queue(), ^{

        cell.accessoryType = UITableViewCellAccessoryNone;
        [self._tableView reloadData];
    });
});


return cell;
4

2 に答える 2

3

バックグラウンドでその配列にアクセスする必要はありません。複雑さを追加するために複雑さを追加しているだけであり、これは決して役に立ちません。

- The tableView loads it's data and asks the dataSource for a row
- You create a row but then ask the table to reload
- The tableView loads it's data and asks the dataSource for a row
- You create a row but then ask the table to reload
- The tableView loads it's data and asks the dataSource for a row
- You create a row but then ask the table to reload
- The tableView loads it's data and asks the dataSource for a row
- You create a row but then ask the table to reload

私はあなたがポイントを得ると思います...

reloadDatatableViewに表示される行を提供するときに呼び出すべきではありません

通常のことを行い、バックグラウンドでデータをフェッチしなかった場合、これは心配する必要のある問題でさえないことに注意してください

アップデート

あなたのコードはバックグラウンドで配列にアクセスします - それに対して何も役に立たず、バックグラウンド スレッドでの作業の結果によってさえ決定されないプロパティを設定するためにメイン スレッドにコールバックします。あなたは実際に何を達成しようとしていますか?

于 2012-08-16T23:14:54.623 に答える
1

あなたは無限ループに陥っています。呼び出すreloadDataと、テーブルが強制的にリロードされ、次が呼び出されます。

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

そして、あなたは最初からやり直します。テーブルではなく、セルを更新する必要があります。試してみる[cell setNeedsLayout];[cell.contentView setNeedsLayout];

于 2012-08-16T23:14:25.823 に答える