欢迎来到天天文库
浏览记录
ID:39468123
大小:86.00 KB
页数:13页
时间:2019-07-04
《SDWebImage源码解读之SDWebImageDownloader》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、SDWebImage源码解读之SDWebImageDownloaderSDWebImageDownloader这个类非常简单,作者的设计思路也很清晰,但是我想在这说点题外话。如果有人问你:你怎么看待编程这件事?你怎么回答。这个问题是我在看这个类的时候,忽然出现在我脑子中的。我突然意识到,其实不管是函数还是属性,他们都是数据。我们编写的所有程序都是在处理数据。函数本身也是一种特殊的数据。真正难的是生产数据的这一过程。举个例子,给你一堆菜籽,要求生产出油来。怎么办?我们首先为这个任务设计一个函数:-(油)用菜籽生产油(菜籽);这就是我们最外层的函数,也应该是我们最开始想到的函
2、数。然后经过我们的研究发现,这个生产过程很复杂,必须分工合作才能实现。于是我们把这个任务分割为好几个小任务:1.-(干净的菜籽)取出杂质(菜籽);2.-(炒熟的菜籽)把菜籽炒一下(干净的菜籽);3.-(蒸了的菜籽)把菜籽蒸一下(炒熟的菜籽);4.-(捆好的菜籽)把菜籽包捆成一块(蒸了的菜籽);5.-(油)撞击菜籽包(捆好的菜籽);大家有没有发现,整个榨油的过程就是对数据的处理。这一点其实很重要。如果没有把-(油)用菜籽生产油(菜籽);这一任务进行拆分,我们就会写出复杂无比的函数。那么就有人要问了,只要实现这个功能就行了呗。其实这往往是写不出好代码的原因。整个任务的设计应该
3、是事先就设计好的。任务被分割成更小更简单的部分,然后再去实现这些最小的任务,不应该是编写边分割任务,往往临时分割的任务(也算是私有函数吧)没有最正确的界限。有了上边合理的分工之后呢,我们就可以进行任务安排了。我们回到现实开发中来。上边5个子任务的难度是不同的。有的人可能基础比较差,那么让他去干筛菜籽这种体力活,应该没问题。那些炒或者蒸的子任务是要掌握火候的,也就是说有点技术含量。那么就交给能胜任这项工作的人去做。所有的这一切,我们只要事先定义好各自的生产结果就行了,完全不影响每个程序的执行。怎么样?大家体会到这种编程设计的好处了吗?我还可以进行合并,把炒和煮合成一个小组,
4、完全可行啊。好了这方面的思考就说这么多吧。如果我想买煮熟了的菜籽,是不是也很简单?有的人用原始的撞击菜籽包榨油,有的人却用最先进的仪器榨油,这就是编程技术和知识深度的区别啊。SDWebImageDownloaderOptions言归正传,当我们需要给某个功能添加Options的时候,一般使用枚举来实现。我们先看看支持的选项:typedefNS_OPTIONS(NSUInteger,SDWebImageDownloaderOptions){SDWebImageDownloaderLowPriority=1<<0,SDWebImageDownloaderProgressive
5、Download=1<<1,//带有进度SDWebImageDownloaderUseNSURLCache=1<<2,//使用URLCacheSDWebImageDownloaderIgnoreCachedResponse=1<<3,//不缓存响应SDWebImageDownloaderContinueInBackground=1<<4,//支持后台下载SDWebImageDownloaderHandleCookies=1<<5,//使用CookiesSDWebImageDownloaderAllowInvalidSSLCertificates=1<<6,//允许验证SS
6、LSDWebImageDownloaderHighPriority=1<<7,//高权限SDWebImageDownloaderScaleDownLargeImages=1<<8,//裁剪大图片};这里提供了这么几种不同的选项,大家可以根据自己的需求选个合适的选项。这里作者使用了掩码。比如说,1<<1,表示把1左移一位,我们把1携程二进制为:00000001,那么左移一位后就是:00000010转成10进制后就是2,也就是说左移一位表示在原来的值上乘以2。再举个例子,当判断self.option是否是SDWebImageDownloaderIgnoreCachedResp
7、onse选项时,应该这么判断:self.option&SDWebImageDownloaderIgnoreCachedResponseSDWebImageDownloaderExecutionOrderSDWebImageDownloaderExecutionOrder定义了数据被调用的顺序。按照一般的想法。下载应该按照数据放入队列的顺序依次进行,但也支持后进先出这种方式。一个下载管理器应该这样管理下载,肯定有一个下载列表,我们可以假定这个列表保存在一个数组中,正常情况下我们应该每次取出数组中第1个元素来下载,这就是FIFO(
此文档下载收益归作者所有