0

私はこのtableViewを持っていて、カスタムの方法でセルを構築したいと考えています。私がそれを行う方法は、セルにサブビューを追加することです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if(cell == nil)
    {
        cell=[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
    }
    else
    {
        UIImageView* img=[UIImage imageNamed:@"abc.png"];
        [cell addSubview:img];    

        //processing the final cell takes time!
    }
    return cell;
}

ただし、不安定なフレーム レートがテーブルの応答性に影響を与えているため、このセルの作成をすべてスレッドに渡したいと思います。そのため、しばらくの間、ある種の画像を配置したいと思います。終了すると、スレッドはcell最終的なセルに更新されます。

これは通常のアプローチですか?

もしそうなら、どうすればスレッドからセルを更新できますか?

すべての変数を __block として定義する必要がありますか? スレに入る前に?

4

1 に答える 1

1

不安定なフレーム レートがテーブルの応答性に影響を与えているため、このセルの作成をすべてスレッドに渡したいと思います。

を含むUIKitの大部分は、スレッドセーフUITableViewCellはありません。Appleのドキュメントから:

ほとんどの場合、UIKit クラスはアプリケーションのメイン スレッドからのみ使用する必要があります。これは特に、UIResponder から派生したクラス、または何らかの方法でアプリケーションのユーザー インターフェイスを操作することを伴うクラスに当てはまります。

...少数の描画およびグラフィック コンテキスト メソッドのみUIKitがスレッド セーフです。セカンダリ スレッドでセルを作成するのは、非常に悪い考えです。あなたはこれをしたくありません。

セルを効率的に作成してテーブル ビューに描画する方法はたくさんあります。誰かがコメントで指摘しているように、UIImageViewセルの作成時ではなく、再利用時に追加しているようです。これは、セルに非常に多くの画像ビューが常に追加されることを意味します。これは明らかに良い考えではありません。

より良いアイデアは、UITableViewCell必要なビューを既に含むサブクラスを作成するか、作成時にそれらを追加して、ビュー タグを介してアクセスすることです。

于 2013-06-10T11:51:51.197 に答える