8

アプリが読み込まれると、99 個のオブジェクトの JSON 表現がプルダウンされます。

各オブジェクトには「image_url」フィールドがあり、これを AFNetworking の に渡しsetImageWithURLRequestます。

私の画像はtableViewに読み込まれるため、最初のいくつかのセルのみが画像を要求します。後続の画像リクエストが行われるのは、下にスクロールするまでではありません。

setImageWithURLRequest最初のデータセットを取得したら、バックグラウンド プロセスを開始して、最初は表示されていない 95 個ほどのオブジェクトをダウンロードし、呼び出されたときに次のようにキャッシュします。プルするキャッシュされたイメージが既にあります。

ただし、AFImageCache は非公開なので、これが可能かどうかはわかりません。NSURLCache を使用してキャッシュできることはわかっていますが、2 つの別個の分離されたキャッシュが必要になり、それも理想的ではありません。

AFNetworking の UIImageView カテゴリを使用しない唯一のオプションはありますか?

これらの答えは私にそう思わせます:

iOS AFImageCache を使用した画像のキャッシュが機能していないようです
AFNetworking の setImageWithURL を使用する場合のキャッシュの設定方法

4

4 に答える 4

24

どうか、これをしないでください。

これはほぼ間違いなく不必要だと私が言うとき、私を信じてください.

実際、おそらく決して見られない画像をダウンロードするというプレッシャーが高まるため、望ましい効果とは逆の効果をもたらす可能性があります.

キャッシュは非常に正当な理由で非公開です。スクロール ビューでの後続の要求を高速化するためだけに存在します。要求に応じてテーブル ビューに画像をダウンロードさせるだけで問題ありません。どちらかといえば、ダウンロードする画像のサイズを最適化できます (正しい画像サイズを確保し、インテリジェントに圧縮します)。

于 2012-07-03T19:10:31.317 に答える
5

あなたの目的を達成するためにたくさんの UIImageView を作成することはありません。それは本当に非効率的なアプローチです。

この機能を実現するために独自のメソッドを追加できますUIImageView+AFNetworking.h。これが最善のアプローチだと思います。テストされていない例は次のとおりです。

+ (void) cacheImageWithURL:(NSURL *)url 
{
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
    [request setHTTPShouldHandleCookies:NO];
    [request setHTTPShouldUsePipelining:YES];

    AFImageRequestOperation *requestOperation = [[[AFImageRequestOperation alloc] initWithRequest:request] autorelease];
    [requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        [[[self class] af_sharedImageCache] cacheImage:responseObject forRequest:request];
    } 
    failure:^(AFHTTPRequestOperation *operation, NSError *error) {}];
}
于 2012-07-03T17:07:35.190 に答える
1

あなたはおそらくFull-Loadedを検討したいでしょう

簡単なセルフ メンテナンス キャッシュは、画像をダウンロードし、URL に依存するファイル名に保存することです。

URL から画像を読み込みたいときはいつでも、最初にハードディスクから読み取ってみてください。nil が返された場合は、画像ダウンローダーを使用してください。

ただし、画像キャッシュをクリアすることを忘れないでください。

于 2012-07-03T06:11:56.043 に答える