1、AFNETWorking
分为5个功能模块:
- 网络通信模块(AFURLSessionManager、AFHTTPSessionManager)
- 网络状态监听模块(Reachability)
- 网络通信安全策略模块(Security)
- 网络通信信息序列化/反序列化模块(Serialization)
- 对与iOS UIKit库的扩展(UIKit)
2、SDWebImage底层实现原理
- 入口setImageWithURL:placeholderImage:options会把placeholderImage显示,然后SDWebImageManager根据URL开始处理图片
- 先从内存图片缓存中查找是否有该图片
- 如果内存缓存中没有,生成NSInvocationOperation添加到队列开始从硬盘查找图片是否已经缓存
- 根据URLKey在硬盘缓存目录下尝试读取图片文件。这一步是在NSOperation进行的操作
- 如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。
- 如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片
- 共享或重新生产一个下载器SDWebImageDownloader开始下载图片。图片下载由NSURLConnection来做,实现相关delegate来判断图片下载中、下载完成和下载失败。
- 图片下载完成后,将图片保存到SDImageCache中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在单独NSInvocationOperation完成,避免拖慢主线程。
简单的流程
根据图片的url去图片缓存中查找对应的图片,如果存在将图片显示在cell上;
根据图片的url去沙盒中查找对应的图片,如果存在,加载沙盒中的对应的图片,将图片显示在cell上;
显示占位图片;
根据图片的url查看下载操作缓存中查找对应的下载操作,如果存在,继续下载;
创建下载操作,并放在下载操作缓存中;
下载成功后,将当前下载操作从下载操作缓存中删除,将图片放在图片缓存中;
刷新表格(当前行);
将图片放入沙盒;
iOS多线程
- NSThread
使用NSThred对象建立一个线程比较方便,但是,要使用NSThread管理多个线程非常困难,线程的生命周期需要自己管理; - NSOperation、NSOperationQueue
是使用GCD实现的一套Objective-C的API,是面向对象的线程技术,提供了一些在GCD中不容易实现的特性,如:限制最大并发数量、操作之间的依赖关系 - GCD
是基于C语言的底层API,用Block定义任务,使用起来非常灵活便捷,提供了更多的控制能力以及操作队列中所不能使用的底层函数。(栅栏方法dispath_barrier_async、延时执行方法dispatch_after、一次行代码dispatch_once、快速迭代方法dispatch_apply、队列组dispatch_group用于多个任务处理完毕之后想要执行的结束处理)
网友评论