2

tableView に画像の遅延読み込みを実装する必要があり、SDWebImage について多くのことを読みましたが、それが実際にどのように機能するのか理解できませんでした。ここで答えが得られることを願っています。

では、SDWebImage で、1 秒あたり 100 セルなど、非常に高速にスクロールするとどうなるでしょうか。これらの画像がメモリに保存されていない場合、SDWebImage はそれらの画像をすべてダウンロードし、保存して解凍しますか?

イメージをキャッシュ ディレクトリに保存する代わりに、「ライブラリ/アプリケーション サポート」にイメージを保存するように SDWebImage に指示できますか? 初めて画像を遅延ロードする必要があるだけです。

4

2 に答える 2

7

SDWebImage は画像が遅延して読み込まれるかどうかを決定するものではないため、通常の意味で「遅延読み込み」とは呼びません。SDWebImage は、そのsetImageWithURL:メソッドの 1 つを呼び出すと、イメージをロードします (バリエーションには、プレースホルダー、プレースホルダーなし、完了ブロック、進行ブロックなどがあります)。セルが描画/表示されているときにのみメソッドを呼び出すのはあなた次第です。これが、遅延読み込みかどうかを決定するものです。最初にすべてのセルを作成すると ( incellForRowAtIndexPath:または同等の方法ではなく)、遅延読み込みにはなりません。SDWebImage はこれとは関係ありません。

SDWebImage が行うことは、バックグラウンド スレッドで画像をロードすることです。そのため、このダウンロードが行われているときに UI/メイン スレッドをブロックすることはありません。さらに、ダウンロードしたすべての画像をディスクにキャッシュし、同じ URL から画像を再ダウンロードすることはありません (これはプラスとマイナスの両方です)。時間に基づいてキャッシュをクリアできます。また、マスター ブランチがキャッシュのディスク制限のサポートも追加したと思います (これは、CocoaPods を使用している場合に関連します。これは、デフォルトで「マスター」に設定されておらず、勝ったからです)この機能を取得できません - CocoaPods のバージョン/タグが更新されている可能性があります。確認する必要があります)。

ここで、追加情報として、iOS NSURLCache (5.0+) が未加工の HTTP 応答のディスク キャッシュを既に実装していることに言及している文献をお読みください。ただし、これは、画像がキャッシュから取得されるたびに、生データを UIImage に変換する必要があることを意味します。一方、SDWebImage は、このオーバーヘッドを節約する UIImage 表現をキャッシュします。

保存先フォルダの変更について、理由をお聞かせ願えますか? SDWebImage は画像を半永久的にキャッシュします (設定する場合はキャッシュ設定によって異なります)。保存された場所はキャッシュには実際には影響しません。コードを変更して別の場所に保存することができます。以下は、変更可能な SDImageCache.m の関連セクションです。SDWebImage コードの残りの部分を確認して、何も壊れていないことを確認する必要があります。

    // Init the disk cache
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    _diskCachePath = [paths[0] stringByAppendingPathComponent:fullNamespace];

これがお役に立てば幸いです。さらに情報が必要な場合はお知らせください。

更新:これに具体的に答えるには:

では、SDWebImage で、たとえば 1 秒あたり 100 セルなど、非常に高速にスクロールするとどうなるでしょうか。これらの画像がメモリに保存されていない場合、SDWebImage はそれらの画像をすべてダウンロードし、保存して解凍しますか?

これらのイメージはダウンロードされます (これがデフォルトの動作であるため、ディスク キャッシュに保存されます)。セルを再利用すると、画像データがメモリから破棄されます ( を使用すると仮定しますdequeueReusableCellWithIdentifier:)。上にスクロールすると、SDWebImage はその特定の URL が既にダウンロードされているかどうかを認識し、ディスク キャッシュに保存されているバージョンを使用します。スクロールが速すぎて、そのセルが再利用される前にダウンロードを完了できなかった場合は、上にスクロールして戻ると、画像のダウンロードが再度試行されます。すすいで繰り返します。

于 2013-07-10T15:36:22.783 に答える
0

私は最近uitableviewでそれを実装しました

あなたは3つのことをしなければならず、それはそれ自体ですべてを処理します

1. プロジェクトに SDWebImage の完全なフォルダーを追加します (追加する際は必ずコピー チェックボックスをオンにしてください)。 2. 遅延読み込みを処理するクラスの先頭にこの行を追加します

  1. 最後に、この行をtableviewcellで使用します

[cell.imageView setImageWithURL:(NSURL *) placeholderImage:(UIImage *)]

それだけです:)乾杯仲間。私もこの問題をたくさん検索しました

于 2013-07-10T15:39:34.727 に答える