SDWebImage是我们经常使用的一个异步图片加载库,大大提高了我们的开发效率。它支持从网络中下载且缓存图片,并设置图片到对应的UIImageView控件或者UIButton控件上。
SDWebImage 概论
1 | 1.提供了一个UIImageView的category用来加载网络图片并且对网络图片的缓存进行管理 |
##SDWebImage知识点的梳理
正常程序退出后,会在几秒内停止工作,要想申请更长的时间,需要用到
beginBackgroundTaskWithExpirationHandler
endBackgroundTask
一定要成对出现使用
NSdirectoryEnumerator
遍历所有的缓存文件不会有性能耗时的问题,检查某个文件是否存在或者检查是否为文件夹都会检查文件的inode 数据,而这个inode中包括file的各种attribute.使用NSCache作为内存储存比NSDictionary的好处是:当系统资源要耗尽的时候可以自动的删减,NSCache不会自动的拷贝键,并且是线程安全的,比NSDictionary线程安全.
线程中
urlCallbacks
的增加,改动都是使用所有增改回调集合URLCallbacks
的操作使用dispatch_barrier_sync
放入队列barrierQueue
中,而查询URLCallbakcs
的操作只需使用dispatch_sync
放入队列barrierQueue
中。
要先说一些系统中锁的问题:
同步锁@synchronized(self)
在self
上加一个同步锁,频繁滥用的话会导致程序会等待另外一段与此代码无关的执行完毕之后才能执行,会耗时.
1 | [_lock lock]; |
这样遇到死锁也会很麻烦,并且效率也不高.
一般情况下想要为代码加锁,最好使用CGD.将所有的操作放到串行队列中执行.而对于并行队列的话就需要,读取的话可以并发进行,并没有任何改动,而增加或者修改数据的话必须保证此时不能进行读取数据,那么可以使用栅栏(barrier)
来设置.在队列中栅栏块必须单独执行,不能与其他一起执行.这对于并发队列来说,如果并发队列发下下面要处理的是栅栏块,那么会一直等前面所有的并发块执行完毕后才执行这个栅栏,而等栅栏执行完毕后才执行其后的并发任务.所以增加和修改使用栅栏可以保证线程安全.
5.图片的解码.当你用 UIImage
或 CGImageSource
的那几个方法创建图片时,图片数据并不会立刻解码。图片设置到 UIImageView
或者 CALayer.contents
中去,并且 CALayer
被提交到 GPU
前,CGImage
中的数据才会得到解码。这一步是发生在主线程的,并且不可避免。如果想要绕开这个机制,常见的做法是在后台线程先把图片绘制到 CGBitmapContext
中,然后从 Bitmap
直接创建图片。目前常见的网络图片库都自带这个功能。SDWebImage
就是在后台生成这种位图.
SDWebImageManager结构
关于结构,我们可以用一张流程图说明
SDWebImageDownloaderOptions
SDWebImageDownloaderOptions
是图片下载选项
1 |
|
SDWebImageDownloaderExecutionOrder
SDWebImageDownloaderExecutionOrder
是图片下载操作的执行方式
1 | typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) { |