015-从网络上缓存图片

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)
        }
    }

你可能感兴趣的:(015-从网络上缓存图片)