1. 效果图

2.代码
import UIKit
class testView2: UIViewController {
let cache = NSCache<AnyObject, AnyObject>()
var imgeView = UIImageView()
let imgUrl = "https://t7.baidu.com/it/u=4162611394,4275913936&fm=193&f=GIF"
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
cache.countLimit = 10
//cache.totalCostLimit = 1024
cache.delegate = self
setUI()
}
func setUI() {
imgeView.frame = CGRect(x: 20, y: 100, width: UIScreen.main.bounds.size.width - 40, height: 350)
view.addSubview(imgeView)
let strArr = ["从网络读取数据","从内存缓存读取数据NSCache","删除ImageV","删除内存缓存NSCache","写入磁盘沙盒缓存","读取沙盒,并写入NSCache"]
for i in 0..<6 {
let btn = UIButton(frame: CGRect(x: 20, y: CGFloat(500 + i * 55), width: UIScreen.main.bounds.size.width - 40, height: 50))
btn.layer.cornerRadius = 10
btn.clipsToBounds = true
btn.setTitle(strArr[i], for: .normal)
btn.backgroundColor = UIColor(red: CGFloat(arc4random() % 255) / 255.0, green: CGFloat(arc4random() % 255) / 255.0, blue: CGFloat(arc4random() % 255) / 255.0, alpha: 1)
btn.tag = i
btn.addTarget(self, action: #selector(clickBtn(_:)), for: .touchUpInside)
view.addSubview(btn)
}
}
}
@objc
extension testView2 {
func clickBtn(_ sender: UIButton) {
switch sender.tag {
case 0:
print("从网络读取数据")
btn1()
case 1:
print("从内存缓存读取数据NSCache")
btn2()
case 2:
print("删除ImageV")
btn3()
case 3:
print("删除内存缓存NSCache")
btn4()
case 4:
print("写入磁盘沙盒缓存")
btn5()
case 5:
print("读取沙盒,并写入NSCache")
btn6()
default:
break
}
}
func btn1() {
let session = URLSession.shared
let url = NSURL(string: imgUrl)
let downloadTask = session.dataTask(with: url! as URL) { [unowned self](data, res, error) in
if error != nil {
print("error:\(String(describing: error))")
return
}
guard let imgData = data else {
print("没获取到图片数据")
return
}
self.cache.setObject(data as AnyObject, forKey: self.imgUrl as AnyObject)
let diskPath = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).map(\.path).last
let fileName = imgUrl.replacingOccurrences(of: "/", with: "")
let fullpath = URL(fileURLWithPath: diskPath ?? "").appendingPathComponent(fileName).path
let isSuccess = NSData(data: imgData).write(toFile: fullpath, atomically: true)
if isSuccess {
print("写入磁盘沙盒成功")
}
DispatchQueue.main.async {
imgeView.image = UIImage(data: imgData)
}
}
downloadTask.resume()
}
func btn2() {
DispatchQueue.global(qos: .background).async {[unowned self] in
let data = cache.object(forKey: imgUrl as AnyObject)
if data != nil {
DispatchQueue.main.async {
imgeView.image = UIImage(data: data as! Data)
}
} else {
print("内存缓存中无数据")
}
}
}
func btn3() {
imgeView.image = nil
}
func btn4() {
cache.removeAllObjects()
}
func btn5() {
// 下载的时候已经存
}
func btn6() {
let diskPath = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).map(\.path).last
let fileName = imgUrl.replacingOccurrences(of: "/", with: "")
let fullPath = URL(fileURLWithPath: diskPath ?? "").appendingPathComponent(fileName).path
print("diskPath:\(diskPath) \n fileName:\(fileName) \n fullPath:\(fullPath)")
guard let imageData = NSData(contentsOfFile: fullPath) else {
return
}
let imgData = imageData as Data
imgeView.image = UIImage(data: imgData)
cache.setObject(imgData as AnyObject, forKey: imgUrl as AnyObject)
}
}
// NSCache
extension testView2: NSCacheDelegate {
func cache(_ cache: NSCache<AnyObject, AnyObject>, willEvictObject obj: Any) {
print("清除缓存",obj)
}
}