美文网首页
一个简单的网络Image缓存类

一个简单的网络Image缓存类

作者: 狂奔的胖蜗牛 | 来源:发表于2017-10-25 14:01 被阅读27次

    该类的主要作用是,下载以及缓存图片,用了很少的代码,很实用。

    代码如下

    import Foundation
    import UIKit
    
    public class YHImageLoader {
        
        var cache = NSCache<NSString, NSData>()
        
        /// 单例
        static let sharedLoader = YHImageLoader()
        
        /// 下载图片
        ///
        /// - Parameters:
        ///   - urlString: 图片url
        ///   - completionHandler: 图片下载完成后的回调
        public func imageForUrl(urlString: String, completionHandler: @escaping(_ image: UIImage?, _ url: String) -> ()) {
            //子线程中下载,并且可以在后台下载
            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 {
                    //缓存中没有,假如url是一个文件路径
                    if (URL(string: urlString) != nil) {
                        data = NSData(contentsOf: URL(string: urlString)!)
                        if data != nil {
                            self.cache.setObject(data!, forKey: urlString as NSString)
                        }
                    }else {
                        //假如路径时错误的,返回
                        return
                    }
                }
                //数据是存在的
                if let goodData = data {
                    let image = UIImage(data: goodData as Data)
                    DispatchQueue.main.async{
                        completionHandler(image, urlString)
                    }
                    return
                }
                //数据不存在,下载
                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是一个单例类
    • cache属性用于缓存下载的图片
    • 下载的逻辑就是,先从cache中读取缓存,如果缓存没有,再判断url是不是文件的路劲,如果是,就读取文件。如果不是,则下载,下载完毕后保存到cache中。
    • 可以根据需要,将下载的图片保存到本地,然后读取的时候,多加一步读取本地是否有该图片。

    相关文章

      网友评论

          本文标题:一个简单的网络Image缓存类

          本文链接:https://www.haomeiwen.com/subject/hvhxpxtx.html