SDWebImage関連

6190 ワード

SDWebImageはgithubに管理されています.https://github.com/rs/SDWebImage
このクラスライブラリは、ネットワークからのリモートピクチャのロードをサポートするUIImageViewカテゴリを提供します.キャッシュ管理、非同期ダウンロード、同一URLダウンロード回数制御、最適化などの特徴がある.使用例のコード:
UItableViewはUIImageView+WebCacheクラス(基本アプリケーション、UIImageViewのcategory)を使用します.
前提#importはUIImageView+WebCache.hファイルをインポートし、tableviewのcellForRowAtIndexPath:メソッド: 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     static NSString *MyIdentifier = @"MyIdentifier";
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];
     }
// Here we use the new provided setImageWithURL: method to load the web image
    [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
    cell.textLabel.text = @"My Text";
    return cell;
 }

//    :[imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/image.jpg"]];
//  SDWebImageManager :             。
SDWebImageManager *manager = [SDWebImageManager sharedManager];
UIImage *cachedImage = [manager imageWithURL:url]; //             
if (cachedImage) {
      //   Cache  ,                
      // Use the cached image immediatly
} else {
      //   Cache    ,             ,          
      // Start an async download
     [manager downloadWithURL:url delegate:self];
}

もちろん、あなたのクラスはSDWebImageManagerDelegateプロトコルを実装し、プロトコルを実装するwebImageManager:didFinishWithImage:メソッドです.
//ダウンロードが完了したらコールバックメソッドを呼び出し、ダウンロードした画像を表示させる
- (void)webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image {
    // Do something with the downloaded image
}

独立した非同期画像ダウンロード
非同期画像を単独でダウンロードする場合は、WindownloaderWithURL:delegate:を使用してSDWebImageDownloaderインスタンスを作成する必要があります.
downloader = [SDWebImageDownloader downloaderWithURL:url delegate:self];
このようにSDWebImageDownloaderDelegateプロトコルの方法imageDownloader:didFinishWithImage:呼び出されるとすぐにダウンロードが開始され、完了します.
独立した非同期画像キャッシュ
SDImageCacheクラスは、空のキャッシュを作成するインスタンスを提供し、メソッドimageForKey:を使用して現在のキャッシュを探します.
UIImage *myCachedImage = [[SDImageCache sharedImageCache] imageFromKey:myCacheKey];
キャッシュに画像を格納する方法storeImage:forKey:
[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey];
デフォルトでは、イメージはメモリキャッシュとディスクキャッシュに格納されます.メモリキャッシュのみを使用する場合は、storeImage:forKey:toDisk:メソッドの3番目のパラメータに負の値を付けます.
代わりに.
SDWebImage 非同期の画像ダウンロード+キャッシュをサポートし、 UIImageView+WebCacha のcategoryで、使いやすいです.SDWebImageが画像をロードする流れを記録します.
いりぐち setImageWithURL:placeholderImage:options: まずplaceholderイメージが表示され、SDWebImageManagerがURLに従って画像の処理を開始します.
SDWebImageManager-downloadWithURL:delegate:options:userInfo:,渡す SDImageCache キャッシュから画像がダウンロードされたかどうかを検索 queryDiskCacheForKey:delegate:userInfo:.
まず、メモリピクチャキャッシュからピクチャがあるかどうかを検索し、メモリにピクチャキャッシュがある場合は、SDImageCacheDelegateコールバック imageCache:didFindImage:forKey:userInfo: SDWebImageManagerへ.
SDWebImageManagerDelegateコールバック webImageManager:didFinishWithImage: UIImageView+WebCacheなどのフロントエンドに画像を展示します.
メモリキャッシュにない場合は、NSInvocationOperationを生成してキューに追加し、ハードディスク(HDD)からピクチャがキャッシュされているかどうかを検索します.
URLKeyに従ってハードディスクキャッシュディレクトリの下で画像ファイルの読み取りを試みます.このステップはNSOperationで行われる操作なので,結果コールバックスレッドが行われる. notifyDelegate:.
前の操作でハードディスク(HDD)から画像が読み込まれた場合は、メモリキャッシュに画像を追加します(空きメモリが小さすぎる場合は、メモリキャッシュが空になります).SDImageCacheDelegateコールバック imageCache:didFindImage:forKey:userInfo:.さらに写真をコールバックします.
ハードディスク(HDD)キャッシュディレクトリから画像が読み込めない場合は、すべてのキャッシュに画像が存在しないことを示します.画像をダウンロードし、コールバックする必要があります. imageCache:didNotFindImageForKey:userInfo:.
ダウンロードの共有または再生成 SDWebImageDownloader 画像のダウンロードを開始します.
画像ダウンロードはNSURLConnectionが行い、関連delegateを実現して画像ダウンロード中、ダウンロード完了、ダウンロード失敗を判断する.
connection:didReceiveData: でImageIOを利用して画像ダウンロードの進捗によるロード効果を行いました.
connectionDidFinishLoading: データダウンロード完了後に渡す SDWebImageDecoder 画像復号処理をする.
ピクチャ復号処理はNSOperationQueueで完了し,メインスレッドUIを遅らせることはない.ダウンロードした画像を二次処理する必要がある場合は、ここでも完成したほうが効率的です.
メインスレッド notifyDelegateOnMainThreadWithInfo: 復号完了宣言、imageDecoder:didFinishDecodingImage:userInfo: SDWebImageDownloaderにコールバックします.
imageDownloader:didFinishWithImage: SDWebImageManagerにコールバックし、画像のダウンロードが完了したことを通知します.
すべてのdownloadDelegatesのダウンロードが完了したことを通知し、必要な場所にコールバックして画像を表示します.
画像をSDImageCacheに保存し、メモリキャッシュとハードディスクキャッシュを同時に保存します.ハードディスク(HDD)へのファイルの書き込みも、プライマリ・スレッドの遅延を回避するために、NSInvocationOperation単独で完了しています.
SDImageCacheは初期化時にメッセージ通知を登録し、メモリ警告やバックグラウンドに戻るときにメモリピクチャキャッシュをクリーンアップし、アプリケーションが終了すると期限切れのピクチャをクリーンアップします.
SDWIも提供しております UIButton+WebCache および MKAnnotationView+WebCache、使いやすいです.
SDWebImagePrefetcher 画像をダウンロードしておくことができ、後続の使用に便利です.
SDWebImageライブラリの役割:UIImgeViewのカテゴリを拡張することで、非同期ロード置換画像の作業を実現します.
主に使用する対象:1、UIImageView(WebCache)カテゴリ、入口パッケージ、読取画像完成後のコールバック2、SDWebImageManagerを実現し、画像を管理する中継局、それらの画像が読み取っていることを記録する.Cache(SDImageCacheを呼び出す)、またはオブジェクトをネットワークに読み込む(SDWebImageDownloaderを呼び出す).SDImageCacheとSDWebImageDownloaderのコールバックを実現します.3、SDImageCacheは、URLのMD 5の要約に基づいて画像を記憶し、読み取り(メモリの存在またはハードディスク上の2つの実装を実現)して画像とメモリのクリーンアップを実現する.4、SDWebImageDownloader、URLに従ってネットワークにデータを読み取る(部分読取と全部読取を実現してからコールバックを通知する方式)
その他のクラス:SDWebImageDecoder、非同期で画像を解凍しました⋯⋯なぜこのような工程をするのか分かりません.(わかりました.機能の説明は以下を参照してください)
面白い点:1、SDImageCacheはどのようにデータ管理をしていますか?SDImageCacheは、メモリレベルとハードディスクレベルの2つの部分に分かれています.メモリレベルはかなりのバッファで、Key-Valueの形で画像を格納しています.メモリが足りない場合は、すべてのキャッシュ画像が消去されます.ファイルシステムを検索する方法で管理し、ファイルの置き換え方法は時間単位で、1週間以上の画像ファイルを削除します.SDWebImageManagerがSDImageCacheにリソースを要求する場合は、まずメモリレベルのデータを検索し、直接戻ってきて、なければディスクにアクセスし、画像をディスクから読み出し、Decoderを行い、画像オブジェクトをメモリレベルにバックアップし、呼び出しレイヤに戻る.
2、なぜデコダーをしなければならないのですか?このブログを通じてhttp://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/UIImageのimageWithData関数は、図面を描くたびにARGBの画像にデータを解凍するため、図面を描くたびに解凍操作が行われ、効率は低いが、瞬時のメモリ需要しかないことが分かった.SDWebImageDecoderでデータにパッケージされたリソースを効率的に解凍し、別の画像に描くことで、この新しい画像を再解凍する必要がなくなります.
この方法は典型的な空間交換の方法である.