创建属于自己的SDWebImage...

因为离职的关系,在寻找工作的工程中呢也写点自己学习到的知识点分享给所有的程序员,当然,我是渣渣,如果有些的不对的请指出来,我会积极改正.
好了,今天我们要做的是实现类似于SDWebimage的异步加载图片的原理;首先新建一个类用于下载图片,对象方法和类方法:如下图所示:


屏幕快照 2016-02-22 下午10.14.04.png

我们可以看到,第一个参数就是我们可以得到的照片的url地址,不过是一个字符串的类型,之后会有一个block进行回调,包含两个参数,error用来得到解析中出现的错误,当error为空的之后,则可以显示得到解析的图片;这就是需要定义的两个方法,用来实现图片的下载;
接下来我们需要实现这两个方法,在CveniEsWebImage.m中实现,我们先来看一下实现的过程;


屏幕快照 2016-02-22 下午10.25.16.png

类似于SDWebImage,我让该类以单例的形式存在于程序中;需要有初始化方法;单例的创建方法想必大家也不陌生了,用的是GCD的一个创建方法,会很容易就能够写出来;
接下来在类方法中调用初始化方法创建对象,让对象调用对象方法;这样就简单的写出了一个类方法,在使用的过程中节约了很多的代码;
屏幕快照 2016-02-22 下午10.25.32.png

最后呢,我们开始写对象方法,也是重点的重点;首先,我们将urlString转化为NSURL类型;我们先从缓存中寻找图片数据,如果没有我们再去实现图片下载的功能;经过md5加密之后,从缓存中寻找一样的图片数据,如果有,则使用Block回调获取UIImage类型的图片;否则,实现图片下载的功能;这里我使用的是NSURLSession的方法实现下载,如果有错误,直接打印错误,返回,如果没有错误但是获取的image数据不对,则是图片的格式出现问题;当这两种错误都没有出现,则说明我们下载的图片是正确的,将下载的数据写入缓存中,在通过Block回调所获取的image和error对象异步返回主线程;最后别忘了[dataTask resume];这个方法;否则无法实现下载功能

屏幕快照 2016-02-22 下午10.26.00.png
屏幕快照 2016-02-22 下午10.25.50.png
   到这里,我们已经实现了图片下载的功能,但是,对于类似于SDWebImage那种还有占位图的功能是怎么实现的,我们需要进行一下的步骤;我们新建一个Category,继承于UIImageView;同时写出两个对象方法,一个拥有占位图,一个没有占位图;具体的实现步骤我们先来看一下图片;
屏幕快照 2016-02-22 下午10.47.37.png
屏幕快照 2016-02-22 下午10.47.48.png

在包含占位图的方法中,先让UIImageView的image属性等于我们给定的占位图;因为是Block中回调得到下载的image对象,所以我们使用__weak来进行弱引用;引入我们创建的下载图片的头文件,使用类方法实现异步下载图片,如果error存在则无法显示图片;如果image不存在也无法显示图片,最后让imgView.image=image;则可以实现异步加载图片了.具体的代码我会上传到GitHub上,有兴趣的同学可以自己下载下来仿照写一下,我也是自己写一点,网上抄一点,不管怎么样把别人的东西变成自己的才是最好的,日积月累总会学到很多的,代码写的不好,还请多多指出来.最后如果有哪家公司在招聘iOS开发,请联系我,坐标北京,求大神带,想学到更多的知识

GitHub下载地址:https://github.com/CveniEs/imageDownload.git

推荐阅读更多精彩内容