0

メソッド内でインターネットから小さな画像(たとえば、60 x 60)をフェッチする場合:

-(UITableViewCell *) tableView:(UITableView *) tableView 
                       cellForRowAtIndexPath:(NSIndexPath *)indexPath {  ...  }

行数が25に固定されている場合と、長さを可変(たとえば、100、または1000)にできる場合はどうなりますか?セルを「再利用」するために使用する場合dequeueReusableCellWithIdentifier、おそらくこのセルのサブビュー(そのうちの1つは60 x 60の画像)を削除する必要があるため、ユーザーがリストを上下にスクロールすると、セルが再利用されます。 、画像はネットから再取得され、スクロール中にあちこちで一時停止することができます。

しかし、を削除しdequeueReusableCellWithIdentifierて常に新しいセルを割り当てると、次のようになります。

    cell = [[UITableViewCell alloc] 
               initWithStyle:UITableViewCellStyleDefault
               reuseIdentifier:TableViewCellIdentifier];

次に、上下にスクロールするとNSLog、画像がまだフェッチされていることが示されます。フェッチされた画像を格納するために配列を個別に使用したくない場合、それを防ぐ方法はありますか?

(現在、動作は最初に約7つの画像がフェッチされ、テーブルを3行下にスクロールすると、3つの画像がフェッチされ、テーブルを3行上にスクロールすると、3つの画像が再度フェッチされます)

4

5 に答える 5

2

画像キャッシュメカニズムが必要です。画像が存在しない場合はダウンロードしてください。再フェッチする必要がある場所に有効期限を設定します。次にそれを表示します。

次回ロードするとき。ダウンロード済みの画像を表示し、有効期限を確認します。有効期限が切れている場合は、もう一度ダウンロードして、表示を更新します。

ものすごく単純。

唯一の厄介な問題は、ダウンロード後に画像を上書きする必要があることです。これをGUIDでテストします。画像のダウンロードが要求されたら、テーブルビューまたは画像オブジェクト自体にUUIDを配置します。また、ダウンロードタスクと一緒にそのUUIDを送信します。ダウンロードが戻ったら、ダウンロードのUUIDを表示アイテムのUUIDに対してテストします。それらが等しい場合。次に、表示を更新します。それらが変更された場合は、別のダウンロードが要求され、あなたのダウンロードを上書きしました。したがって、そのプロセスによってイメージが変更され、そのUUIDを含むダウンロードがまもなく終了し、ダウンロードされたコンテンツでイメージが変更されます。

お役に立てば幸いです:)

于 2012-08-23T01:22:31.503 に答える
1

スクロールビューが一時停止している限り、画像を別のスレッドにロードする必要があります(キャッシュされていない場合、または DarkAngel の回答に従って更新する必要がある場合)。私は NSOperationQueue を使用します。 NSOperationQueue の設定に関する優れたチュートリアルを次に示します。必要なときにタスクを追加できるアプリ デリゲートで共有キューを使用することをお勧めします。

于 2012-08-23T01:57:28.303 に答える
1

Volureが述べたように、画像キャッシュを使用できます。また、これらの画像に対してなんらかの形式の遅延読み込みを実装することもお勧めします。これにはさまざまな実装があります。このプロジェクトは、非同期読み込みをサポートする UIImageView のサブクラスです。

また、この質問を見てください。回答が役立つ場合があります。

お役に立てれば。

于 2012-08-23T01:42:40.117 に答える
1

SDWebImage または AFNetworking を使用してください。どちらも UIImageView のカテゴリを提供し、キャッシュ メカニズムを提供します。

つまり、イメージ ダウンローダ ライブラリ (SDWebImage または AFNetworking) がキャッシュ内にイメージを見つけた場合、Web からイメージを再ダウンロードするのではなく、ディスクからイメージを取得するだけです。

cellForRowAtIndexPath: テーブル ビュー デリゲート メソッドで、おそらくメイン スレッドで NSURLConnection を使用してサムネイル画像をダウンロードしているため、遅延が発生する可能性が最も高いことがわかります。

SDWebImage または AFNetworking は、基本的にすべての面倒な作業を行い、テーブルをレスポンシブにします。あなたがしなければならないことは、実際には次のことだけです。

[myThumbnailImageView imageWithURL:imageURL placeholder:[UIImage imageNamed:@"myPlaceholderImage.png"]];

そこにその行を入れたら、それで終わりです。ダウンロードが完了すると、実際の画像が表示されます。それまでは、テーブル ビューをスムーズにスクロールし続けることができます。画像がダウンロードされていない場合、各セルには、指定したプレースホルダー画像 (上記のコード行を参照) が表示されます。

于 2012-08-23T04:22:44.980 に答える
0

画像をダウンロードする利便性を高めるには、EGOImageLoader/EGOImageView を使用して、このリンクhttps://github.com/enormego/EGOImageLoadingからこのクラスをダウンロードします。

この EGOCache から、イメージを保存するために使用されます。初めてダウンロードするときは、UITableview をスクロールしながら EGOCache ストアから画像を取得します。そのクラスでは、ダウンロードしたイメージをキーで保存します。キーは、imageUrl のハッシュ値です。同じキーを使用してキャッシュから画像を取得します。タミララサン

于 2013-10-23T07:21:59.310 に答える