SDWebImageの処理を追ってみる
SDWebImageの振る舞いが気になる
SDWebImageは良くWeb画像のダンロードや画像データのキャッシュに用いられるライブラリだがその中身の実装がどうなっているか気になって夜も眠れない。
SDWebImageについては以下を参照
keita-matsushita.hatenablog.com
処理を追う
よく使用する下のメソッドの処理の流れをソースコードを覗いてみる。
このメソッドはUIImageView+WebCache.mというファイルに定義されていた。
SDWebImage/UIImageView+WebCache.m at master · rs/SDWebImage · GitHub
このメソッドの中ではsd_setImageWithURL
というメソッドが呼ばれている。上記のメソッドの引数にprogress
とcompleted
という引数がブロックで定義されていた。progressは画像のダウンロードの進捗具合、completedはダンロードが完了したタイミングで呼ばれ、ダウンロードが成功したか失敗したかが引数により確認することができる。
さらに内部的にsd_internalSetImageWithURL
というメソッドが呼ばれている。これはUIView+WebCache.m
というファイルに定義されている。UIImageView+WebCache.mファイルに#import "UIView+WebCache.h"
という記述があることからも分る。
画像のキャッシュの管理について
sd_internalSetImageWithURLメソッド内でloadImageWithURL
という怪しいメソッドが呼ばれている。この処理のブロックの引数として得られた画像やらエラーやらを使ってcompletedBlockなどを呼んでいる。loadImageWithURL
はSDWebImageManager.m
というファイルに定義されてる。queryCacheOperationForKey
というメソッドで画像がキャッシュされているか否かをチェックしている。
具体的にはキーが存在しなければSDImageCacheTypeNone
をブロックの引数に指定し返している。キーが存在する場合は、メモリー上にキャッシュが存在するか確認している。この時NSCacheクラスが使われている。メモリー上に無ければディスク上にキャッシュが存在するか確認する。ディスクへの読み書きは時間のかかる処理なので非同期で実装されていることが分る。