web-dev-qa-db-ja.com

IOSアプリで使用する画像と動画を非同期でダウンロードしてキャッシュするにはどうすればよいですか?

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

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

この記事 非同期画像キャッシュについて(旧2009)

この記事 NSURLCacheについて

SDWebImage (見栄えは良いですが、画像でのみ機能します)

AFDownloadRequestOperation

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

15
user379468

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

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を使用し、ビデオには上記のコードを使用することです。

31
Ed Chin

強力な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/

0
Utsav Dusad