2009-05-23 10 views
4

現在、単純なデータを含む多くのセルを含む1つのUITableViewControllerがあります。 UITableViewControllerがUITableViewCellをインスタンス化すると、各セルのバックグラウンドスレッドの実行が開始され、サーバーから状態が取得されます。 UITableViewCellはサブクラス化されていて、すでにUIImageViewプロパティを持っています。このプロパティは、サーバーからのデータの準備ができたらコンテンツビューに追加する必要があります。データが利用可能になったら、UITableViewCellを効率的に再描画する方法

私の問題は、バックグラウンドスレッドから新しいデータを取得するたびに[tableView reloadData]を呼び出す必要があるということです。影響を受けたセルに直接アクセスしてcontentViewにUIImageViewを追加するだけで十分です。私は、自分のデータ管理ユーティリティがその作業(サーバーに話すこと)を終えたときに、そのセルを見つける最善の方法がわからないだけです。

バックグラウンドタスクを実行するためにデータマネージャを呼び出すときにセルのindexPathを渡した後、タスクが完了したときにindexPathを戻すなどの処理を行うのは意味がありますか?それは過労ですか?

この共通のタスクを処理するための好きな方法は何ですか?

ありがとう、SOの乗組員。

答えて

5

セル内でデータを変更する必要がある場合は、dequeueReusableCellWithIdentifier:(NSString *)識別子メソッドを使用しません。これは、UITableViewのセルのキャッシュを停止します。テーブルビューのセルが画面からスクロールして解除されると、それらは解放されます。セルを描画する直前に呼び出されるデリゲートメソッド

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

があります。これを使用すると、indexPathをマネージャに渡すことができます。あなたのデータが戻ってくると

することは、私は通常、細胞内のテキストを設定し、そのUIViewのスーパークラスのメソッドを呼び出して、 - (void)setNeedsLayoutその後、セルを取得する方法

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

を呼び出します。
これは、セルに再描画を指示します。

私が行った別の方法は、カスタムセルを使用して、そのカスタムセルサブクラスが描画時にそのデータのマネージャを直接呼び出させることです。データが返ってくると、内部のUILabelオブジェクトを更新するためにカスタムデリゲートメソッドを呼び出し、setNeedsLayoutを呼び出します。

0

イメージがロードされている間にセルにプレースホルダが付いていても構わない場合は、Three20ライブラリでTTImageViewのようなものを使用できます。イメージビューは常にセル内にあり、イメージURLを指定します。イメージビューはURLリクエストを処理し、イメージがロードされると自動的に表示されます。

私はThree20を使用しませんが、私はコードで非常によく似たことをしています。これは、表のセル再利用識別子と互換性があります。セルが画面からスクロールして、その画像ビューURLが新しい値に変更され、URL要求が取り消され(まだ実行中の場合)、新しいものが開始されます。キャッシングと組み合わせると、スクロールバックするとイメージが瞬時に読み込まれます。

+0

ダニエル - それが動作します。私の問題は、私はすでにイメージがあることです。私はちょうどサーバー上のモデルからより多くの情報を取得する必要があります。だから、私は、セルのサブクラス自体、またはデキュープロセス内にロジックを残す必要があるかどうかで壊れてしまいます。 –

+0

@Steve - 追加のデータがセルの高さの変更を終了した場合、とにかくテーブル全体のリロードを行う必要があります。それ以外の場合、私はあなたのセルをデータフェッチリクエストの代理人にします。 dataRequestのようなもの:receivedData: –

関連する問題