1、从网络上缓存图片
/// 缓存单张图片
///
/// - Parameters:
/// - list: 模型
/// - finished: 刷新数据回调
private func cacheSingleImage(list: [RevanstatusModel], finished: @escaping (_ isSuccess: Bool, _ shouldRefresh: Bool)->()) {
/// 0.创建调度组
let group = DispatchGroup()
/// 记录下载图片大小
var length = 0
//遍历数组,查找微博数据中有单张图片的,进行缓存
for vm in list {
/// 1.判断图像数量
if vm.picURLs?.count != 1 {
continue
}
/// 2.代码执行到这里,数组中有且只有一张图片
guard let pic = vm.picURLs?[0].thumbnail_pic,let url = URL(string: pic) else {
continue
}
print("要缓存的 URL 是\(url)")
// A> 入组
group.enter()
// 3> 下载图像
// 1.downloadImage 是 SDWebImage 的核心方法
// 2.图像下载完成之后,会自动保存在沙盒中,文件路径是 URL 的 md5
// 3.如果沙盒中已经存在缓存的图像,后续使用 SD 通过 URL 加载图像,都会加载本地沙盒地图像
// 4.不会发起网络请求,同时,回调方法同样会调用
// 5.方法还是同样的方法,调用还是同样的调用,不过内部不会再次发起网络请求
//***** 注意点:如果要缓存的图像累计太大,要找后台要接口
SDWebImageManager.shared().downloadImage(with: url, options: [], progress: nil, completed: { (image, _, _, _, _) in
/// 将图像转换成二进制数据
if let image = image, let data = UIImagePNGRepresentation(image) {
// NSData 是 length 属性
length += data.count
print("缓存图像是\(image) 长度 \(length)")
/// 更新单张图像的尺寸
vm.updateSingleImageSize(image: image)
// B>出组 - 放在回调的最后一句
group.leave()
}
})
}
// C> 监听调度组情况
group.notify(queue: DispatchQueue.main) {
print("图像缓存完成\(length / 1024)K")
///目的:在缓存单张图片成功之后,在进行刷新表格
finished(true, true)
}
}