15

画像とビデオの両方を表示する iPhone アプリケーションがあります。アプリのほとんどの画像と動画の構造は変わりませんが、1 つ追加されることがあります。画像とビデオの両方を非同期にダウンロードしてキャッシュし、アプリケーションが終了した後もそれらが保持されるようにするための、最も簡単で最適な方法について意見をお願いします。また、私が本当に関心があるのは IOS 5 以降だけです。

これまでに見つけた情報をいくつか示しますが、最善の方法が何であるか、キャッシュが永続的かどうかについてはまだ不明です.

非同期画像キャッシュに関するこの記事(旧 2009)

NSURLCache に関するこの記事

SDWebImage (見栄えは良いが画像のみで動作)

AFDownloadRequestOperation

これはかなり一般的な使用例のように思えるので、ベスト プラクティスやサンプル コードへの参照を探しています。

4

2 に答える 2

32

ダウンロードとキャッシュは非常に簡単です。次のコードは、非同期的にダウンロードしてキャッシュします。

NSCache *memoryCache; //assume there is a memoryCache for images or videos

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{

    NSString *urlString = @"http://URL";

    NSData *downloadedData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];

    if (downloadedData) {

        // STORE IN FILESYSTEM
        NSString* cachesDirectory = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString *file = [cachesDirectory stringByAppendingPathComponent:urlString];
        [downloadedData writeToFile:file atomically:YES];

        // STORE IN MEMORY
        [memoryCache setObject:downloadedData forKey:urlString];
    }

    // NOW YOU CAN CREATE AN AVASSET OR UIIMAGE FROM THE FILE OR DATA
});

画像の非同期ダウンロードは非常に簡単ですが、SDWebImage のようなライブラリを非常に価値あるものにする UIImages 特有のものがあります。画像を表示するとき、iOS は遅延画像解凍スキームを使用するため、遅延が発生します。これらの画像をtableViewセルに入れると、ジャギースクロールになります。正しい解決策は、バックグラウンドで画像を解凍 (またはデコード) し、解凍した画像をメイン スレッドで表示することです。

遅延画像解凍の詳細については、http: //www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/を参照してください。

私のアドバイスは、画像には SDWebImage を使用し、ビデオには上記のコードを使用することです。

于 2013-02-19T16:02:24.973 に答える
0

強力な iOS 画像キャッシュ コンポーネントは次のことを行う必要があります。

  • イメージを非同期でダウンロードして、メイン キューの使用を最小限に抑える
  • バックグラウンド キューで画像を解凍します。これは些細なことではありません。バックグラウンド解凍に関する強力な記事を参照してください
  • 画像をメモリとディスクにキャッシュします。メモリ不足のためにアプリが閉じられているか、メモリをパージする必要がある可能性があるため、ディスクへのキャッシュは重要です。この場合、ディスクからイメージを再ロードする方が、ダウンロードするよりもはるかに高速です。注: メモリ キャッシュに NSCache を使用する場合、メモリ警告が発行されると、このクラスはその内容をすべて消去します。NSCache の詳細はこちら http://nshipster.com/nscache/
  • 解凍したイメージをディスクとメモリに保存して、解凍をやり直さないようにする
  • GCD とブロックを使用します。これにより、コードのパフォーマンスが向上し、読み書きが容易になります。最近では、非同期操作には GCD とブロックが必須です
  • あると便利: 些細な統合のための UIImageView 上のカテゴリ。あると便利: ダウンロード後、キャッシュに保存する前に画像を処理できます。

IOS での高度なイメージング


iOS でのイメージング、SDK フレームワーク (CoreGraphics、Image IO、CoreAnimation、CoreImage) の仕組み、CPU と GPU などの詳細については、@rsebbe によるこの素晴らしい記事を参照してください

ソース: https://bpoplauschi.wordpress.com/2014/03/21/ios-image-caching-sdwebimage-vs-fastimage/

于 2016-05-07T07:32:32.917 に答える