Image的学习

Image的学习_第1张图片
图片来之网络

支持图片的缓存
异步加载
支持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的底层太熟悉了。

你可能感兴趣的:(Image的学习)