SDWebImage

3355 ワード

私のような菜鳥はSDWebImageを使い始めたばかりでsdしか使えませんでした.setImageWithUrl:.画像をキャッシュすれば十分だと思いますが、SDWebImageには強いものがあります.私たちはまだ発見していません.いったい~
最も簡単なsd_setBackGroundImageWithUrl:(PS:皆さん、私を殴らないでください.SDWebImageがbuttonの画像をキャッシュできるとは知らなかったので)buttonの背景画像をキャッシュするのはもちろんtitleColorを含む方法も連想します
次にSDWebImageの真髄についてお話しします.「optionsのすべてのオプション」

optionsはきっと私と同じようにこれを使ったことがない菜鳥がいるでしょう。

// 
SDWebImageRetryFailed = 0,
//UI , UIScrollView 
SDWebImageLowPriority = 1 
// 
SDWebImageCacheMemoryOnly = 2
// , 
SDWebImageProgressiveDownload = 3
// 
SDWebImageRefreshCached = 4
// 
SDWebImageContinueInBackground = 5
//NSMUtableURLRequest.HTTPShouldHandleCookies = YES
SDWebImageHandleCookies = 6
// SSL 
SDWebImageAllowInvalidSSLCertificates = 7
// 
SDWebImageHighPriority = 8
// 
SDWebImageDelayPlaceholder = 9,
// 
SDWebImageTransformAnimatedImage = 10

SDWebImage内部実装プロセス


1.エントリsetImageWithURL:placeholder Image:options:placeholder Imageが表示され、SDWebImageManagerがURLに従って画像の処理を開始します.2.SDWebImageManager-downloadWithURL:delegate:options:userInfo:に入り、SDImageCacheに渡してキャッシュから画像を検索queryDiskCacheForKey:delegate:userInfo:.3.メモリピクチャキャッシュからピクチャがあるかどうかを検索し、メモリにピクチャキャッシュがある場合、SDImageCacheDelegateはimageCache:didFindImage:forKey:userInfo:SDWebImageManagerにコールバックします.4.SDWebImageManagerDelegateコールバックwebImageManager:didFinishWithImage:UIImageView+WebCacheなどのフロントエンドに画像を表示します.5.メモリキャッシュにない場合は、NSInvocationOperationを生成してキューに追加し、ハードディスク(HDD)からピクチャがキャッシュされているかどうかを検索します.6.URLKeyに従ってハードディスクキャッシュディレクトリの下で画像ファイルの読み取りを試みます.このステップはNSOperationでの操作なので、結果コールバックnotifyDelegate:.7.前の操作でハードディスク(HDD)から画像が読み込まれた場合は、メモリキャッシュに画像を追加します(空きメモリが小さすぎる場合は、メモリキャッシュを空にします).SDImageCacheDelegateコールバックimageCache:didFindImage:forKey:userInfo:.さらに写真をコールバックします.8.ハードディスクキャッシュディレクトリから画像が読み取れない場合は、すべてのキャッシュにその画像が存在しないことを示し、画像をダウンロードし、imageCache:didNotFindImageForKey:userInfo:.9.ダウンロード機SDWebImageDownloaderを共有または再生成して画像のダウンロードを開始します.10.画像ダウンロードはNSURLConnectionが行い、関連delegateを実現して画像ダウンロード中、ダウンロード完了、ダウンロード失敗を判断する.11.connection:didReceiveData:ではImageIOを利用して画像ダウンロードの進捗によるロード効果を行っています.12.connectionDidFinishLoading:データのダウンロードが完了したら、SDWebImageDecoderに画像復号処理を依頼します.13.ピクチャ復号処理はNSOperationQueueで完了し、メインスレッドUIを遅らせることはない.ダウンロードした画像を二次処理する必要がある場合は、ここでも完成したほうが効率的です.14.メインスレッドn o t i f y D e l e gateOnMainThreadWithInfo:復号完了を宣言し、imageDecoder:didFinishDecodingImage:userInfo:SDWebImageDownloaderにコールバックする.15.imageDownloader:didFinishWithImage:SDWebImageManagerにコールバックし、画像のダウンロードが完了したことを通知します.16.すべてのdownloadDelegatesのダウンロードが完了したことを通知し、必要な場所に画像を表示するようにコールバックします.17.画像をSDImageCacheに保存し、メモリキャッシュとハードディスクキャッシュを同時に保存します.ハードディスク(HDD)へのファイルの書き込みも、プライマリ・スレッドの遅延を回避するために、NSInvocationOperation単独で完了しています.18.SDImageCacheは、初期化時にメッセージ通知を登録し、メモリ警告やバックグラウンドに戻るときにメモリピクチャキャッシュをクリーンアップし、アプリケーションが終了すると期限切れのピクチャをクリーンアップします.19.SDWIはUIButton+WebCacheとMKAnnotationView+WebCacheも提供されており、使いやすい.20.SDWebImagePrefetcherは、画像をダウンロードしておくことができ、後続の使用に便利です.

最後に、画像をロードするときとロードを完了するときに役立つ方法を説明します。

SDWebImageManager *manager = [SDWebImageManager sharedManager];
 
[manager downloadImageWithURL:imagePath2 options:SDWebImageRetryFailed progress:^(NSInteger receivedSize, NSInteger expectedSize) {
     
    NSLog(@" ");
     
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
     
    NSLog(@" ");
}];