
支持图片的缓存
异步加载
支持UIImageView,UIButton, CALayer和MKAnnotationView
功能
打开YYKit的Image文件夹,会发现类非常的多并各自实现相应的功能。
- YYImage 提供生产图片的各种方法,名称,路径,字节流。支持gif和webp等格式。
- YYFrameImage 创建帧图片,可设置多张图片和每张图片的间隔时间。配合YYAnimatedImageView使用,可以实现类似Gif的动画效果。
- YYSpriteSheetImage 设置一个图片8行12列的小精灵,设置内容图片大小和延迟的数组,配合YYAnimatedImageView使用,可以实现类似Gif的动画效果。
- YYAnimatedImageView 继承UIImageView,支持播放动画。
- YYImageDecoder 保存图片的基础内容。
- YYImageCache 图片缓存到内存和硬盘。
- YYWebImageOperation 开启子线程从网络获取图片,并缓存图片。
- YYWebImageManager 从缓存或者调用YYWebImageOperation从网络获取图片,并进行缓存操作。
效果为:

分类-方便使用
- UIImageView+YYWebImage 直接设置UIImageView的图片和高亮图片,并可以设置图片加载中,图片转换和图片加载完成的block。
- UIButton+YYWebImage 直接设置UIButton的不同状态的图片和背景图片,并可以设置图片加载中,图片转换和图片加载完成的block。
- CALayer+YYWebImage 设置CALayer的图片,并可以设置图片加载中,图片转换和图片加载完成的block。
- MKAnnotationView+YYWebImage 设置MKAnnotationView的图片, 并可以设置图片加载中,图片转换和图片加载完成的block。
- _YYWebImageSetter 将所有图片网络加载功能抽出。
使用很方便和SDWebImage提供的方法一致。
知识点
查看了所有的代码后,除了主要流程外,使用最多的是(1)异步操作,包括主线程和线程队列。 (2)多线程的锁操作。
异步操作
dispatch_async_on_main_queue(^{
});
dispatch_async([_YYWebImageSetter setterQueue], ^{
});
这个文章很多,使用方法也比较简单。 不过需要明确的知道,对UI的修改必须在主线程完成。
锁操作
所有涉及设置的修改,都使用了锁。保证同时只有一个线程对数据进行修改。
- (instancetype)init {
self = [super init];
_lock = dispatch_semaphore_create(1);
return self;
}
- (NSURL *)imageURL {
dispatch_semaphore_wait(_lock, DISPATCH_TIME_FOREVER);
NSURL *imageURL = _imageURL;
dispatch_semaphore_signal(_lock);
return imageURL;
}
- dispatch_semaphore_create 创建信号量,1为拥有总的信号量,相当于同时只能有1个线程进行操作。
- dispatch_semaphore_wait 等待信号量,如果有信号量那么就立即执行。如果没有信号量,那么等待。
- dispatch_semaphore_signal 释放信号量,信号量释放后,其他线程就可以继续操作了。
// END YY大神代码编写真的很好,一直在想,是不是有模仿的啊。不然写出这样的代码,对iOS的底层太熟悉了。
网友评论