第一步构造图片下载的类WYWebImageManager
1.构造下载方法
2.内存中拿到图片
3.从磁盘中获取数据
3.1判断当前任务是否在下载避免重复下载
3.2自定义NSOperation下载当然SD 用的是NSURLSession 我这里为了方便就没这样,以后有时间我在继续改
我来解释下handdict为什么要这样写,如果看不懂和我交流
第二步自定义WYWebImageDownLoadOperation
2.1重载start方法
重载父类的方法,但是在ios4以后,不管是并发还是非并发,队列都会为operation提供一个线程来执行。所以isConcurrent这个变量也就没有用处了。但是,这里还设涉及到了两个方法,start和main.按照官方文档所说,如果是非并发就使用main,并发就使用start。
那现在并发和非并发已经没有区别了,start和main的区别在哪里呢?
main方法的话,如果main方法执行完毕,那么整个operation就会从队列中被移除。如果你是一个自定义的operation并且它是某些类的代理,这些类恰好有异步方法,这是就会找不到代理导致程序出错了。
然而start方法就算执行完毕,它的finish属性也不会变,因此你可以控制这个operation的生命周期了。
然后在任务完成之后手动cancel掉这个operation即可。
具体实现
锁采用的是信号量,较早的sd版本的有@synchronized,后来改成了信号量,信号量在不涉及到磁盘读写的时候性能非常高,
2.操作任务
重载父类的属性
1.将KVO改成手动关闭自动,保证不会被随意调用
第三步UIImageView+WYWebCache
1.为外界提供下载方法
if (self.wy_urlString && self.wy_urlString.length>0 && ![self.wy_urlString isEqualToString:urlString])
第4步外界调用
这就是仿照SDWebImage的实现图片下载的思路
其他
1处理内存警告
2.加载图片路径
与SD不同的是SD用实在NSCache里面创建了一个Default文件夹管理自己下载的图片,这样话不会影响到我们的app 其他放在Cache的文件
3.清理内存