YYKit是iOS中组件的集合。具体可以分为以下几个组件:
YYModel — iOS 的高性能模型框架。
YYCache — 适用于 iOS 的高性能缓存框架。
YYImage - iOS 的图像框架,用于显示/编码/解码动画 WebP、APNG、GIF。
YYWebImage — 异步图像加载框架。
YYText — 适用于 iOS 的强大富文本组件。
YYKeyboardManager — 访问键盘视图并跟踪键盘动画。
YYDispatchQueuePool — 用于管理全局调度队列的 iOS 实用程序类。
YYAsyncLayer — 用于异步渲染和显示的 iOS 实用程序类。
YYCategories — 一组适用于 Foundation 和 UIKit 的有用类别。
常用的学习记录:
YYCache:是一个高性能iOS缓存框架.内部使用YYMemoryCache和YYDiskCache进行内存缓存和磁盘缓存
YYMemoryCache:内存缓存,使用双向链表的LRU算法的缓存机制
1.(最近使用的数据放在最前边,这样长时间未使用的数据在后边,淘汰删除)
2.(监听进入后台/内存告警的通知,当收到通知时,删除所有内存缓存)
3.(增/删/查都是使用pthread_mutex互斥锁来使线程同步,来保障线程安全)
YYDiskCache:磁盘缓存,使用文件存储和SQLite数据库存储,支持异步操作(默认20K)
1.(缓存淘汰算法:缓存支持LRU淘汰算法)
2.(支持多种缓存控制方法:总数量,总大小,存活时间)
3.(可以配置磁盘空间,没有空闲时自动删除缓存数据)
4.(根据缓存数据大小来自动获取对象的存储类型)类型:File/sqlite/都存
YYKVOStorage:YYDiskCache的底层具体实现,用于磁盘缓存
一.API基本和NSCache保持一致,所有方法都是线程安全的。
二.缓存的自动清理和释放都放在子线程处理,通过GCD把需要释放的对象捕捉到指定队列所在线程的Block中释放
三.使用性能更好的SQLite:官网最新的SQLite版本比iOS系统自带的sqlite3.dylib性能要高很多
四.使用性能更好的锁:YYCache采用dispatch_semaphore和pthread_mutex两种锁用于线程同步。
概念知识: 1.理解iOS中图片从文件渲染屏幕的过程: 一般情况下,显示是由CPU和GPU协作来完成的渲染,一次渲染的过程,大致如下: CPU:计算frame,图片解码,通过数据总线将需要绘制的纹理图片交给GPU GPU:纹理混合,顶点变换与计算,像素点的填充计算,渲染到帧缓冲区 2.图片压缩是一个非常耗时的CPU操作,并且它是默认在主线程中执行,当需要加载的图片比较多的时候,就会对应用性能造成严重影响。为什么要解压缩图片?而不是直接将图片显示在屏幕上呢?
我们经常接触到的PNG,JPEG图片都是一种压缩的位图图形格式,因此,在将磁盘中的图片渲染到屏幕之前,必须要先得到图片的原始像素数据,才能执行后续的绘制操作,这就是为什么要对图片解压缩的原因
3.解压缩原理
当未解压缩的图片将要渲染到屏幕时,系统会在主线程对图片进行解压缩,而如果图片已经解压缩了,系统就不会再对图片进行解压缩,而解压缩十分消耗性能,我们不希望让它在主线程执行,因此就有了业内常用的解决方案,在子线程提前对图片进行解压缩。 原理:就是对图片进行重新绘制,得到一张新的解压缩后的位图,其中用到的最核心的函数就是CGBitmapContextCreate
总结:
1.图片文件只有在确认要显示时,CPU 才会对其进行解压缩。因为解压缩是非常耗时性能的事情,解压过的图片就不会重复解压,会缓存起来。
2.图片渲染到屏幕的过程:读取文件 -> 计算 Frame -> 图片解码 -> 解码后纹理图片位图数据通过数据总线交给 GPU -> GPU获取图片 Frame -> 顶点变换计算 -> 光栅化 -> 根据纹理坐标获取每个像素点的颜色值(如果出现透明值需要将每个像素点的颜色*透明值度)-> 渲染到帧缓存区 -> 渲染到屏幕
获取加载压缩图片data信息、解压缩图片信息、处理图片、渲染内容
YYImage框架主要有下面几个文件组成
YYImage:UIImage 能加载png,jpg,gif等多种格式图片
YYFrameImage: 继承自UIImage,遵循YYAnimatedImage协议。主要负责帧动画图片的加载。帧动画为一组图片,帧动画由图片帧和图片每帧时间段组成,最后根据这些参数形成动画。
YYSpriteSheetImage:主要做游戏
YYAnimatedImageView:继承自UIImageView,是UIKit显示图片的接口,其主要负责动画图片播放,配合UIImage,YYImage,YYFrameImage,YYSpriteSheetImage使用,由于内部使用CADisplayLink编写,动画可以放runloop的DefaultMode中执行,避免了滚动视图滑动时性能的消耗,默认为CommontMode,若想成功播放gif等动画,必须使用该类
YYImageCoder:包含了YYImageEncoder,YYImageDecoder,YYImageFrame等类,主要负责图片编/解码,以及图片相关信息的保存。
YYText是一个功能强大的iOS富文本编辑与显示框架。
YYLabel是上层的控件类,类似于UILabel,继承自UIView,但是在UILable的基础上提供了异步排版和渲染,图文混排,文本高亮,文本容器控制,竖排文字等高级特性 YYTextView是上层的控件类,类似于UITextView,