iOS学习笔记-125.SDWebImage1——基本使用

SDWebImage1——基本使用

一、说明

以下关于源码的注释来自于


文顶顶 的注释。


图片的显示有多个方法,下面我们主要来看看以下的三个方法。

1.1 UIImageView+WebCache 中最复杂的方法

/*
 * 根据图片的url下载图片并设置到ImageView上面去,占位图片
 * 异步下载并缓存
 *
 * @param url            图片的URL
 * @param placeholder    显示在UIImageView上面的占位图片,直到图片下载完成
 * @param options        下载图片的选项。参考SDWebImageOptions的枚举值
 * @param progressBlock  下载的进度回调
 * @param completedBlock 当操作执行完毕之后的回调。该回调没有返回值
 *      第一个参数为请求的图片
 *      第二个参数是NSError类型的,如果图片下载成功则error为nil,否则error有值
 *      第三个参数是图片缓存的使用情况(内存缓存|沙盒缓存|直接下载)
 *      第四个参数是图片的URL地址
 */
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;

1.2 SDWebImageManager 中的方法

 * 如果URL对应的图像在缓存中不存在,那么就下载指定的图片 ,否则返回缓存的图像
 *
 * @param url 图片的URL地址
 * @param options 指定此次请求策略的选项
 * @param progressBlock 图片下载进度的回调
 * @param completedBlock 操作完成后的回调
 *      此参数是必须的,此block没有返回值
 *      Image:请求的 UIImage,如果出现错误,image参数是nil
 *      error:如果出现错误,则error有值
 *      cacheType:`SDImageCacheType` 枚举,标示该图像的加载方式
 *          SDImageCacheTypeNone:从网络下载
 *          SDImageCacheTypeDisk:从本地缓存加载
 *          SDImageCacheTypeMemory:从内存缓存加载
 *          finished:如果图像下载完成则为YES,如果使用 SDWebImageProgressiveDownload 选项,同时只获取到部分图片时,返回 NO
 *          imageURL:图片的URL地址
 *
 * @return SDWebImageOperation对象,应该是SDWebimageDownloaderOperation实例
 */
- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url
                                         options:(SDWebImageOptions)options
                                        progress:(SDWebImageDownloaderProgressBlock)progressBloc
                                       completed:(SDWebImageCompletionWithFinishedBlock)completedBlock;

1.3 SDWebImageDownloader中的方法

/*
 * 使用给定的 URL 创建 SDWebImageDownloader 异步下载器实例
 * 图像下载完成或者出现错误时会通知代理
 * url:要下载的图像 URL
 * SDWebImageDownloaderOptions:下载选项|策略
 * progressBlock:图像下载过程中被重复调用的 block,用来报告下载进度
 * completedBlock:图像下载完成后被调用一次的 block
 *      image:如果下载成功,image 参数会被设置
 *      error:如果出现错误,error 参数会被设置
 *      finished:
            如果没有使用 SDWebImageDownloaderProgressiveDownload,最后一个参数一直是 YES
 *          如果使用了 SDWebImageDownloaderProgressiveDownload 选项,此 block 会被重复调用
 *              1)下载完成前,image 参数是部分图像,finished 参数是 NO
 *              2)最后一次被调用时,image 参数是完整图像,而 finished 参数是 YES
 *              3)如果出现错误,那么finished 参数也是 YES
 *  返回值:可被取消的 SDWebImageOperation
 */

- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url
                                         options:(SDWebImageDownloaderOptions)options
                                        progress:(SDWebImageDownloaderProgressBlock)progressBlock
                                       completed:(SDWebImageDownloaderCompletedBlock)completedBlock;

二、UIImageView+WebCache 中最复杂的方法 示例

2.1 示例代码

/*内存+磁盘缓存*/
-(void)download{

    NSString *path = @"http://www.qqpk.cn/Article/UploadFiles/201112/20111208140318990.jpg";
    //内部也是调用了 download2的方法
    /*
     第一个参数:下载图片的url地址
     第二个参数:占位图片
     第三个参数:progress 进度回调
         receivedSize:已经下载的数据大小
         expectedSize:要下载图片的总大小
     第四个参数:
        image:要下载的图片
        error:错误信息
        cacheType:缓存类型
        imageURL:图片url
     */
    [self.imageView sd_setImageWithURL:[NSURL URLWithString:path] placeholderImage:[UIImage imageNamed:@"image1"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {

    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
        switch (cacheType) {
            case SDImageCacheTypeNone:
                NSLog(@"不使用缓存,直接下载");
                break;
            case SDImageCacheTypeDisk:
                NSLog(@"使用磁盘缓存");
                break;
            case SDImageCacheTypeMemory:
                NSLog(@"使用内存缓存");
                break;
        }
    }];
}

2.2 SDWebImageOptions枚举说明

//使用位移枚举,通过按位与&按位或|的组合方式传递多个值
typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) {

    /**
     * 默认情况下,如果一个url在下载的时候失败了,那么这个url会被加入黑名单,不会尝试再次下载。如果使用该参数,则该URL不会被添加到黑名单中。意味着会对下载失败的URL尝试重新下载。
     * 此标记取消黑名单
     */
    SDWebImageRetryFailed = 1 << 0, //失败后尝试重新下载

    /**
     * 默认情况下,在 UI 交互时也会启动图像下载,此标记取消这一特性
     * 会推迟到滚动视图停止滚动之后再继续下载
     * 备注:NSURLConnection 的网络下载事件监听的运行循环模式是 NSDefaultRunLoopMode
     */
    SDWebImageLowPriority = 1 << 1, //低优先级

    /**
     * 使用该参数,将禁止磁盘缓存,只做内存缓存
     */
    SDWebImageCacheMemoryOnly = 1 << 2, //只使用内存缓存

    /**
     * 此标记允许渐进式下载,就像浏览器中那样,下载过程中,图像会逐步显示出来
     * 默认情况下,图像会在下载完成后一次性显示
     */
    SDWebImageProgressiveDownload = 1 << 3, //渐进式下载

    /**
     * 遵守 HTPP 响应的缓存控制,如果需要,从远程刷新图像
     * 磁盘缓存将由 NSURLCache 处理,而不是 SDWebImage,这会对性能有轻微的影响
     * 此选项用于处理URL指向图片发生变化的情况
     * 如果缓存的图像被刷新,会调用一次 completion block,并传递最终的图像
     */
    SDWebImageRefreshCached = 1 << 4,   //刷新缓存

    /**
     * 如果系统版本是iOS 4+的,那么当App进入后台后仍然会继续下载图像。
     * 这是向系统请求额外的后台时间以保证下载请求完成的
     * 如果后台任务过期,请求将会被取消
     */
    SDWebImageContinueInBackground = 1 << 5,    //后台下载

    /**
     * 通过设置,处理保存在 NSHTTPCookieStore 中的 cookies
     */
    SDWebImageHandleCookies = 1 << 6,   //处理保存在NSHTTPCookieStore中的cookies

    /**
     * 允许不信任的 SSL 证书
     * 可以出于测试目的使用,在正式产品中慎用
     */
    SDWebImageAllowInvalidSSLCertificates = 1 << 7,     //允许不信任的 SSL 证书

    /**
     *  默认情况下,图像会按照添加到队列中的顺序被加载,此标记会将它们移动到队列前端被立即加载
     *  而不是等待当前队列被加载,因为等待队列加载会需要一段时间
     */
    SDWebImageHighPriority = 1 << 8,    //高优先级(优先下载)

    /**
     * 默认情况下,在加载图像时,占位图像已经会被加载。
     * 此标记会延迟加载占位图像,直到图像已经完成加载
     */
    SDWebImageDelayPlaceholder = 1 << 9,    //延迟占位图片

    /**
     * 通常不会在可动画的图像上调用transformDownloadedImage代理方法,因为大多数转换代码会破坏动画文件
     * 使用此标记尝试转换
     */
    SDWebImageTransformAnimatedImage = 1 << 10, //转换动画图像

    /**
     * 下载完成后手动设置图片,默认是下载完成后自动放到ImageView上
     */
    SDWebImageAvoidAutoSetImage = 1 << 11   //手动设置图像
};

2.3 图示

image


三、SDWebImageManager 中的方法 示例

3.1 说明

其实上面我们示例中使用的图片的方法,调用的就是我们接下来用的这个方法。

我们可以看到 UIImageView + WebCache 中有如下代码

- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock {

          ..........

         // 实例化 SDWebImageOperation 操作
        id <SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
            //移除UIActivityIndicatorView
            [wself removeActivityIndicator];
            if (!wself) return;

            //下面block中的操作在主线程中处理
            dispatch_main_sync_safe(^{
                if (!wself) return;
                //如果图片下载完成,且传入的下载选项为手动设置图片则直接执行completedBlock回调,并返回
                if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock)
                {
                    completedBlock(image, error, cacheType, url);
                    return;
                }
                else if (image) {   //否则,如果图片存在,则设置图片到UIImageView上面,并刷新重绘视图
                    wself.image = image;
                    [wself setNeedsLayout];
                } else {
                    //如果没有得到图像
                    //如果传入的下载选项为延迟显示占位图片,则设置占位图片到UIImageView上面,并刷新重绘视图
                    if ((options & SDWebImageDelayPlaceholder)) {
                        wself.image = placeholder;
                        [wself setNeedsLayout];
                    }
                }
                if (completedBlock && finished) {
                    completedBlock(image, error, cacheType, url);
                }
            });
        }];

     ........
}

3.2 示例代码

/*内存+磁盘缓存*/
-(void)download2{
    NSString *path = @"http://www.qqpk.cn/Article/UploadFiles/201112/20111208140318387.jpg";
    [[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:path] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
        NSLog(@"%f",1.0*receivedSize/expectedSize);
    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
        switch (cacheType) {
            case SDImageCacheTypeNone:
                NSLog(@"不使用缓存,直接下载");
                break;
            case SDImageCacheTypeDisk:
                NSLog(@"使用磁盘缓存");
                break;
            case SDImageCacheTypeMemory:
                NSLog(@"使用内存缓存");
                break;
        }
        self.imageView.image = image;
    }];
}

3.3 图示

image


四、SDWebImageDownloader中的方法 示例

4.1 说明

我们接下来使用的这个方法,它的 completed 代码块是在子线程中运行的,如果我们要刷新UI需要提交操作到主线程中。

4.2 示例代码

/*不要任何缓存的处理*/
-(void)download3{
     NSString *path = @"http://www.qqpk.cn/Article/UploadFiles/201112/20111208140318960.jpg";
    [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:path] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {

    } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
        //它处于子线程中
        NSLog(@"%@",[NSThread currentThread]);
        [[NSOperationQueue mainQueue] addOperation:[NSBlockOperation blockOperationWithBlock:^{
            self.imageView.image = image;
        }]];
    }];
}

4.3 图示

image


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值