マツシタのお勉強

SDWebImageの処理を追ってみる

SDWebImageの振る舞いが気になる

SDWebImageは良くWeb画像のダンロードや画像データのキャッシュに用いられるライブラリだがその中身の実装がどうなっているか気になって夜も眠れない。

SDWebImageについては以下を参照

keita-matsushita.hatenablog.com

処理を追う

よく使用する下のメソッドの処理の流れをソースコードを覗いてみる。

このメソッドはUIImageView+WebCache.mというファイルに定義されていた。

SDWebImage/UIImageView+WebCache.m at master · rs/SDWebImage · GitHub

このメソッドの中ではsd_setImageWithURLというメソッドが呼ばれている。上記のメソッドの引数にprogresscompletedという引数がブロックで定義されていた。progressは画像のダウンロードの進捗具合、completedはダンロードが完了したタイミングで呼ばれ、ダウンロードが成功したか失敗したかが引数により確認することができる。

さらに内部的にsd_internalSetImageWithURLというメソッドが呼ばれている。これはUIView+WebCache.mというファイルに定義されている。UIImageView+WebCache.mファイルに#import "UIView+WebCache.h"という記述があることからも分る。

画像のキャッシュの管理について

sd_internalSetImageWithURLメソッド内でloadImageWithURLという怪しいメソッドが呼ばれている。この処理のブロックの引数として得られた画像やらエラーやらを使ってcompletedBlockなどを呼んでいる。loadImageWithURLSDWebImageManager.mというファイルに定義されてる。queryCacheOperationForKeyというメソッドで画像がキャッシュされているか否かをチェックしている。

具体的にはキーが存在しなければSDImageCacheTypeNoneをブロックの引数に指定し返している。キーが存在する場合は、メモリー上にキャッシュが存在するか確認している。この時NSCacheクラスが使われている。メモリー上に無ければディスク上にキャッシュが存在するか確認する。ディスクへの読み書きは時間のかかる処理なので非同期で実装されていることが分る。