SDWebImage源码分析(二)

   继续上一篇没有完成的,上一篇的地址

   上一篇说到了从缓存和本地都没有读取到图片的话就从网络中获取图片这一部分,关于上一篇留下的问题"为什么在SDWebImageDownloaderOperation的start方法的start方法最后启用了runloop"的问题,我初步的理解了一下:每一个线程对应着一个运行时,主线程默认有一个运行时,子线程需要手动启动一个runloop,否则子线程需要延时执行(类似于不是立即结束的任务)就不会执行。这个里面就是connection的代理方法不会执行.我写了下面的代码测试了我的说法是正确的.

    MyOperation继承自Operation,实现了start方法


   MyOperation--start方法的实现,以及NSURLConnectionDataDelegate的方法.


如果在start方法末尾不添加一个运行时的话,下面的代理方法就不会执行。将上面的代码放在主线程里面就会执行下面的delegate方法,因为主线程默认是有运行时的.

总结一下:1):NSTimer scheme方法开启的定时器会默认加入一个运行时,但是使用NSTimer timewith的方法,就需要手动添加runloop,否则就不会运行定时器;2):performSelector方法的线程也是默认会加入运行时,也不需要手动去添加.


继续正文,直接看connectionDelegate的代理方法

                                                                                                                                                                              从上到下:1):第一个方法就是请求的返回对象response,这个里面通过判断返回的状态码是否是请求成功,请求成功就获取了返回的数据的大小,保存为一个全局变量,这个值在后面做返回数据的进度条的时候会用上。

               2):第二个方法就是接受数据的方法,这个就是每一次返回的数据的大小,追加进一个全局的NSMutableData里面,这个就是当前已经接受的数据的大小,这个里面还回调了接收数据的进度条。

                3):就是数据接受完成要调用的方法,首先停掉了当前的runloop,然后将获取到的数据生成了Image,调用block将Image返回回去.

                4):数据没有接受完成请求失败的方法.

                5):缓存的什么方法,没什么内容,下面一个不知道,最后一个是什么证书授权什么,不是很明白.

    至此,网络下载到了图片,图片已经生成并且返回回去了。再回到核心的SDWebImageManager文件的下载文件的block处

  
下面的block主要的操作就是在主线程里面执行block,然后将图片缓存起来的方法(这个里面包含了本地文件的存储以及缓存的存储),就是下面的两个方法

    再执行的话就是在主线程直接设置图片了,如下

  源码分析到此结束


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值