4

簡単な質問はtableView:cellForRowAtIndexPath、サーバーから画像をプリフェッチし、テーブルに 20 行または 25 行しかない場合にセルを再利用しないように、「非表示セル」(セル 8 から 25 など) に対してを強制的に呼び出すことはできますか? ?


詳細:のメカニズムは主に、特に iPhone や iPod Touch でメモリを保持するためのものだと思います。そのため、テーブルに 1000 行ある場合、1000 個のオブジェクト (は のサブクラス)はtableView:cellForRowAtIndexPath存在しません。これらのオブジェクトは「再利用」できるため、メモリの使用量を小さく抑えることができます。UITableViewCellUITableViewCellUIView

しかし、各行にサーバー上でフェッチされた画像がある場合はどうなるでしょうか? 別のスレッドで別の画像キャッシュを構築する代わりにtableView:cellForRowAtIndexPath、最初の 7 つの画像をフェッチしてテーブルを表示し、後でセル 8 から 25 を強制的にレンダリングし、呼び出しを行わないようにすることはできますdequeueReusableCellWithIdentifierか (したがって、25 のそのようなUITableViewCellオブジェクトがあり、それらを再利用しないでください)。それはどのように行うことができますか?それは実際に実用的で簡単な解決策ですか?

4

4 に答える 4

6

画像のキャッシュはビューレイヤーにほとんど属していません。サーバーからのこれらの画像の取得も行いません。

投稿で説明しているアプローチを採用する必要があります。つまり、画像をテーブルとは別にキャッシュしてから、その画像キャッシュからこれらの画像を取得します。

ImageProviderキーに基づいてイメージを提供するクラスを作成し、そのプロバイダーを使用してテーブルセルを作成できます。次に、ImageProviderサーバーから画像をロードするか、キャッシュから画像をロードするかを決定し、テーブルビューから詳細を非表示にします。

このアプローチにより、かなりの柔軟性が得られます。デバイスにローカルで画像をキャッシュすることでネットワークトラフィックを節約する場合は、別のキャッシュを使用するアプローチにより、ビューレイヤーを妨害することなくそれを行うことができます。また、メモリ不足の警告を受け取った場合などに、キャッシュされた画像を一時ファイルにフラッシュすることでメモリを節約することもできます。

于 2012-08-23T20:20:02.863 に答える
0

すべてのセルをロードするよりも、必要なすべての画像をプリフェッチすることをお勧めします。この目的でSDWebImageを使用することをお勧めします。また、UITableViewの内容を表示する前にすべての画像をロードするために使用できる画像プリフェッチャーも含まれています。

于 2012-08-24T03:09:14.050 に答える
0

これはひどい考えですが、テーブルと同じ大きさのUIScrollViewを作成し、スクロールを無効にしたUITableViewを追加することで、これを行うことができます。

CGSize tableSize = CGSizeMake(320, 1000);
UIScrollView* aScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, tableSize.width, tableSize.height)];

UITableView* aTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, tableSize.width, tableSize.height)];
aTableView.scrollEnabled = NO;
[aScrollView addSubview:aTableView];
[aTableView release];

[self.view addSubview:aScrollView];
[aScrollView release];
于 2012-08-23T21:26:08.930 に答える
0

UITableViewを強制的に呼び出すことはできませんtableView:cellForRowAtIndexPath

私が考えることができる回避策はUITableViewCell、事前にインスタンスを作成し、それらをに格納して、事前に作成された行の配列にインデックスを付けるために作成済みのインスタンスを返すことですNSArraytableView:cellForRowAtIndexPath

于 2012-08-23T20:08:45.800 に答える