這篇文章會比較短,對上一篇沒有陳述好的問題進行一些補充。
1.上一篇說到SDImageCache使用完整的URL來作為磁盤緩存的key鲸阔。但是有時候為了訪問控制的目的楣责,URL的部分內(nèi)容會是動態(tài)的,這樣磁盤緩存就起不了作用仔沿。
對于這個問題,SDWebImageManager給出了一個解決辦法(也就是說單獨使用SDImageCache是沒有的,需要自己修改源碼):設置一個cacheKeyFilter省容,以NSURL作為輸入,輸出一個NSString作為緩存key燎字。
下面是SDWebImage GitHub主頁的示例代碼:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) {
url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path];
return [url absoluteString];
};
// Your app init code...
return YES;
}
2.今天去面試的時候被問到腥椒,關于cleanDiskWithCompletionBlock:中使用NSdirectoryEnumerator的性能問題。使用NSdirectoryEnumerator遍歷所有的緩存文件到底會不會造成性能問題候衍,需不需要改進笼蛛。
經(jīng)過查詢stackoverflow,知道使用NSdirectoryEnumerator遍歷所有的緩存文件蛉鹿,獲取文件屬性滨砍,如我們需要的文件大小信息,是不會有性能問題的。NSdirectoryEnumerator獲取文件屬性是通過查看文件的inode數(shù)據(jù)惋戏,并不需要想象中的fileopen和fileclose领追。
inode中所包含的、UNIX用戶經(jīng)常使用的一些重要信息:
- inode編號
- 用來識別文件類型日川,以及用語stat C函數(shù)的模式信息
- 文件的鏈接樹木
- 屬主的UID
- 屬主的組ID(GID)
- 文件的大小
- 文件所使用的磁盤塊的實際數(shù)目
- 最近一次修改的時間
- 最近一次訪問的時間
- 最近一次更改的時間
3.關于為何不在SDWebImage直接使用NSCache蔓腐,而需要自定義它的子類AutoPurgeCache。
說明這個問題之前龄句,先看看我們使用NSCache的優(yōu)點回论。
NSCache的優(yōu)點:
- 自動刪減功能
- 線程安全
- 不會拷貝健
這就是為何我們選用類似于集合的NSCache,而不用NSDictionary自己實現(xiàn)緩存的考慮了分歇。
但是傀蓉,根據(jù)這個stackoverflow問題,NSCache在iOS7系統(tǒng)中不會響應內(nèi)存告警职抡,所以在SDWebImage中就子類化了NSCache葬燎,自己監(jiān)聽內(nèi)存告警,并removeAllObjects.