仿照SDWebImage实现图片下载思路

第一步构造图片下载的类WYWebImageManager

1.构造下载方法

2.内存中拿到图片

仿照SDWebImage实现图片下载思路_第1张图片

3.从磁盘中获取数据

3.1判断当前任务是否在下载避免重复下载


仿照SDWebImage实现图片下载思路_第2张图片

3.2自定义NSOperation下载当然SD 用的是NSURLSession 我这里为了方便就没这样,以后有时间我在继续改


仿照SDWebImage实现图片下载思路_第3张图片

我来解释下handdict为什么要这样写,如果看不懂和我交流


第二步自定义WYWebImageDownLoadOperation

2.1重载start方法

重载父类的方法,但是在ios4以后,不管是并发还是非并发,队列都会为operation提供一个线程来执行。所以isConcurrent这个变量也就没有用处了。但是,这里还设涉及到了两个方法,start和main.按照官方文档所说,如果是非并发就使用main,并发就使用start。

那现在并发和非并发已经没有区别了,start和main的区别在哪里呢?

main方法的话,如果main方法执行完毕,那么整个operation就会从队列中被移除。如果你是一个自定义的operation并且它是某些类的代理,这些类恰好有异步方法,这是就会找不到代理导致程序出错了。

然而start方法就算执行完毕,它的finish属性也不会变,因此你可以控制这个operation的生命周期了。

然后在任务完成之后手动cancel掉这个operation即可。

具体实现


仿照SDWebImage实现图片下载思路_第4张图片

锁采用的是信号量,较早的sd版本的有@synchronized,后来改成了信号量,信号量在不涉及到磁盘读写的时候性能非常高,

2.操作任务


仿照SDWebImage实现图片下载思路_第5张图片


仿照SDWebImage实现图片下载思路_第6张图片

重载父类的属性


仿照SDWebImage实现图片下载思路_第7张图片

1.将KVO改成手动关闭自动,保证不会被随意调用

仿照SDWebImage实现图片下载思路_第8张图片

第三步UIImageView+WYWebCache

1.为外界提供下载方法

if (self.wy_urlString && self.wy_urlString.length>0 && ![self.wy_urlString isEqualToString:urlString])

仿照SDWebImage实现图片下载思路_第9张图片

第4步外界调用

这就是仿照SDWebImage的实现图片下载的思路

其他

1处理内存警告

仿照SDWebImage实现图片下载思路_第10张图片

2.加载图片路径


仿照SDWebImage实现图片下载思路_第11张图片

与SD不同的是SD用实在NSCache里面创建了一个Default文件夹管理自己下载的图片,这样话不会影响到我们的app 其他放在Cache的文件

3.清理内存


仿照SDWebImage实现图片下载思路_第12张图片

你可能感兴趣的:(仿照SDWebImage实现图片下载思路)