雖然這個功能都被寫爛了绝葡,但反正有空带族,動手用Swift3.0稍微封裝了一下拗窃,100行不到搞定,簡單粗暴直接上代碼锌畸。
func getImage(with urlString:String,isDiskCache:Bool = false,timeout:TimeInterval = 10)
{
let path = NSSearchPathForDirectoriesInDomains(.cachesDirectory,.allDomainsMask, true)[0] + "/image.txt"
let finish = { image in
DispatchQueue.main.async{
self.movieImg.image = image
}
}
let handle = {
if let url = URL(string: urlString)
{
URLSession.shared.downloadTask(with: URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: timeout)){
location,response,error in
if let fileUrl = location
{
do
{
let data = try Data(contentsOf: fileUrl)
//需要磁盤緩存
if isDiskCache
{
var dict = [String:Data]()
//先取一下取得出來就接著存
if let fileData = FileManager.default.contents(atPath: path)
{
let unarchiver = NSKeyedUnarchiver(forReadingWith: fileData)
if let temp = unarchiver.decodeObject(forKey: "imgData") as? [String:Data]
{
dict = temp
}
}
//合并數(shù)據(jù)
dict["\(url)"] = data
//編碼
let fileData = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWith: fileData)
archiver.encode(dict, forKey: "imgData")
archiver.finishEncoding()
//覆蓋寫入
if !fileData.write(to:URL(fileURLWithPath: path, isDirectory: false), atomically: true)
{
print("保存失敗")
}
}
finish(UIImage(data:data))
}
catch
{
print(error)
}
}
}.resume()
}
}
//磁盤緩存
if isDiskCache
{
DispatchQueue.global().async{
//文件磁盤緩存路徑下能取出來
if let fileData = FileManager.default.contents(atPath: path)
{
let unarchiver = NSKeyedUnarchiver(forReadingWith: fileData)
if let dict = unarchiver.decodeObject(forKey: "imgData") as? [String:Data],let data = dict["\(urlString)"]
{
finish(UIImage(data:data))
}
//1.文件壞了 2.沒有這個圖片的緩存 3.根本取不出來 --->乖乖下載
else
{
handle()
}
unarchiver.finishDecoding()
}
else
{
handle()
}
}
}
//內(nèi)存緩存
else
{
//內(nèi)存緩存會容易被刪除
handle()
}
}
簡單解釋一下
-
handle
閉包簡單封裝了一下涉及網(wǎng)絡(luò)請求的部分勇劣。finish
閉包簡單封裝了一下回調(diào)部分,可以改寫這個閉包輕松改變回調(diào)內(nèi)容潭枣。
- 如果需要磁盤緩存,
isDiskCache
設(shè)置為true
比默。(默認(rèn)為false
) - 默認(rèn)超時為10s
函數(shù)流程:
- 如果非磁盤緩存,則直接去
handle
,根據(jù)URL
請求圖片并執(zhí)行回調(diào)
- 如果需要磁盤緩存盆犁,先判斷有沒有緩存文件命咐,第一次肯定沒有,就需要去下載并緩存;
如果有緩存文件蚣抗,就嘗試讀一下緩存侈百,沒有此圖片的緩存或文件讀取失敗 還是要去下載并緩存。