2009-06-19 6 views
2

私はセルに使用しているUITableViewサブクラスとUITableViewCellサブクラスを持っています。私はすべてのセルをあらかじめ膨らませていて、cellForRowAtIndexPathでそれらを使う配列からそれらを格納しています。これ以外にも、バックグラウンドで各セルの画像を読み込むスレッドがあります。問題は、画像がロードされるのと同じくらい速く細胞がリフレッシュされないことです。たとえば、テーブルビューをスクロールしないと、最初のセルは、すべてのセルが変更され、スレッドが終了したときにのみリフレッシュされます。UITableViewをリフレッシュする

どのように私は効果的に私のtableview /セルを更新することができますかに関するアイデア?

+0

これが回答されていますか? –

答えて

8

[cell setNeedsDisplay]を呼び出そうとしましたが、メインスレッドで試しましたか?

バックグラウンドスレッドで呼び出されsetNeedsDisplayはかなり何もしない、

はこれを試してみてください。

[cell performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO]; 
+2

+1の "メインスレッド"。聖なる牛は、それは私をナッツを運転していた! –

0

あなたのテーブルビューのコントローラに画像がロードされたことを通知するためにコールバックを使用していますか?そうでない場合、それは理想的な方法でしょう。

イメージがロードされると、イメージをセルに設定するテーブルビューコントローラへのコールバックを起動し、tableViewでreloadDataを呼び出します。 新しいイメージが読み込まれるたびにテーブルが更新され、表示されます。

+1

Jasarienは正しいです、あなたはViewControllerへのコールバックに何らかの種類のデリゲートを使って、セルの画像を更新する必要があります。セルでreloadDataまたはsetNeedsDisplayを呼び出すことができます。また、行を前もって作ってはいけないと考えるべきです。これにより、パフォーマンスが低下し、セルの数に応じて1トンのメモリが使用されます。限られた数のセルを再使用する必要があります。 – Jab

0

イメージで達成しようとしていることを正確にはわかりませんが、サーバーから来ていると思いますので、別のスレッドでダウンロードしたいのですが?

テーブルを表示する前にセルをロードしようとしません。できるだけレイジーローディングを使用して、デバイス上のメモリを最大限に活用してください。

私の提案は、NSOperationのサブクラスを使ってイメージの読み込みを管理する方法です。まず、NSOperationはスレッドの複雑さをすべて処理し、操作をキューに入れることができます。次に、上部にあるセルについて完了したい操作に優先順位を付けることができます。

各操作が完了すると、セルまたはtableViewController(おそらくこれを簡単にするためのデリゲートプロトコルを作成する)にコールバックすることができます。

イメージ/セルの組み合わせごとに操作している場合は、操作が完了するたびに各セルをリフレッシュできる必要があります。これを操作の優先順位付けとともに行うことで、最適なソリューションが得られます。

NSOperationsが複雑に聞こえる場合、またはこれで延期されている場合は、試してみてください。これは、音を出す可能性が非常に簡単です。

0

[cell setNeedsDisplay]に電話してみましたか?

+0

OK、ここに私がやっていることがあります:from cellForRowAtIndexPath私は表示されているすべてのセルに必要な表示を送信しています。しかし、違いはなく、細胞は更新されません。私はsetneedsdisplayがかなりuselesだと感じ始めている... –

関連する問題