該類的主要作用是员淫,下載以及緩存圖片,用了很少的代碼板乙,很實(shí)用砸脊。
代碼如下
import Foundation
import UIKit
public class YHImageLoader {
var cache = NSCache<NSString, NSData>()
/// 單例
static let sharedLoader = YHImageLoader()
/// 下載圖片
///
/// - Parameters:
/// - urlString: 圖片url
/// - completionHandler: 圖片下載完成后的回調(diào)
public func imageForUrl(urlString: String, completionHandler: @escaping(_ image: UIImage?, _ url: String) -> ()) {
//子線程中下載具篇,并且可以在后臺(tái)下載
DispatchQueue.global(qos: DispatchQoS.QoSClass.background).async {
var data: NSData?
//從緩存中讀取
if let dataCache = self.cache.object(forKey: urlString as NSString) {
data = dataCache as NSData
}else {
//緩存中沒(méi)有,假如url是一個(gè)文件路徑
if (URL(string: urlString) != nil) {
data = NSData(contentsOf: URL(string: urlString)!)
if data != nil {
self.cache.setObject(data!, forKey: urlString as NSString)
}
}else {
//假如路徑時(shí)錯(cuò)誤的凌埂,返回
return
}
}
//數(shù)據(jù)是存在的
if let goodData = data {
let image = UIImage(data: goodData as Data)
DispatchQueue.main.async{
completionHandler(image, urlString)
}
return
}
//數(shù)據(jù)不存在驱显,下載
URLSession.shared.dataTask(with: URL(string: urlString)!, completionHandler: { (data, response, error) in
if (error != nil) {
completionHandler(nil, urlString)
return
}
if data != nil {
let image = UIImage(data: data!)
self.cache.setObject(data! as NSData, forKey: urlString as NSString)
DispatchQueue.main.async {
completionHandler(image, urlString)
}
return
}
}).resume()
}
}
}
使用
import UIKit
class ViewController: UIViewController {
var image: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
image = UIImageView(frame: view.frame)
view.addSubview(image)
YHImageLoader.sharedLoader.imageForUrl(urlString: "https://ss1.baidu.com/6ONXsjip0QIZ8tyhnq/it/u=1427822428,3741610415&fm=173&s=CCB707D069FB3B86C28DD507030080C9&w=640&h=353&img.JPG") { [weak self] (image, url) in
if let weakSelf = self {
weakSelf.image.image = image
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
邏輯如下
- YHImageLoader是一個(gè)單例類
- cache屬性用于緩存下載的圖片
- 下載的邏輯就是,先從cache中讀取緩存瞳抓,如果緩存沒(méi)有埃疫,再判斷url是不是文件的路勁,如果是孩哑,就讀取文件栓霜。如果不是,則下載横蜒,下載完畢后保存到cache中胳蛮。
- 可以根據(jù)需要,將下載的圖片保存到本地丛晌,然后讀取的時(shí)候仅炊,多加一步讀取本地是否有該圖片。