SDWebImage学习笔记

2022-01-11  本文已影响0人  希尔罗斯沃德_董

SDWebImage是什么

SDWebImage是一个提供了高效的图片异步加载、图片缓存和图片处理等功能的一个第三方开源框架。

SDWebImage做了什么,怎么做?

接口设计

用UIKit相关类的Category封装图片加载的接口。

图片下载

图片下载管理器SDImageLoadersManager+NSOperationQueue+自定义NSOperation并重写start、finish、cancel等方法用于管理图片加载队列。

图片缓存

缓存图片,分内缓存和磁盘缓存,同时配合着多种缓存策略,以供开发者根据具体业务需求选择使用。

图片的其他处理。

SDWebImage为什么要这么做?

接口为什么用Category

Category封装接口方便调用。

图片下载队列管理

NSOperationQueue+自定义NSOperation并重写start、finish等方法用于管理图片加载队列,为了start和finish在一个线程里执行,方便管理,这样外部就只关心队列的本身的本身。

图片缓存机制

分内缓存和磁盘缓存。配合各种缓存策略实现。

配合着多种缓存策略,开发者可以根据业务需求自行选择,同时根据自身app性能做做一些自定义的优化。内存缓存大小和过期时间都可以自定义,收到内存警告清理掉NSCache,只保留NSMapTable的弱引用。

内存优化
图片的其他处理。

1、创建一张位图的上下文Context=CGBitmapContextCreate
2、绘制图片到这个CGContextDrawImage(Content)
3、通过上下文Content生成图片newImageRef=CGBitmapContextCreateImage(Content)

核心代码如下:

    CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Host;
    bitmapInfo |= hasAlpha ? kCGImageAlphaPremultipliedFirst : kCGImageAlphaNoneSkipFirst;
    CGContextRef context = CGBitmapContextCreate(NULL, newWidth, newHeight, 8, 0, [self colorSpaceGetDeviceRGB], bitmapInfo);
    if (!context) {
        return NULL;
    }
    
    // Apply transform
    CGAffineTransform transform = SDCGContextTransformFromOrientation(orientation, CGSizeMake(newWidth, newHeight));
    CGContextConcatCTM(context, transform);
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), cgImage); // The rect is bounding box of CGImage, don't swap width & height
    CGImageRef newImageRef = CGBitmapContextCreateImage(context);
    CGContextRelease(context);

解码2-渐进式解码:

CGImageSourceCreateIncremental->CGImageSourceUpdateData->CGImageSourceCreateImageAtIndex
1、CGImageSourceCreateIncremental创建一个空的CGImageSourceRef
2、图片数据更新之后调用CGImageSourceUpdateData将图片数据ImageData更新到CGImageSourceRef中
3、CGImageSourceCreateImageAtIndex生成CGImageRef

上一篇 下一篇

猜你喜欢

热点阅读