http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 4417|回复: 6

[相关工具] SDWebImage框架使用详解

[复制链接]
发表于 2018-12-25 09:48:55 | 显示全部楼层 |阅读模式
本帖最后由 竹林风 于 2018-12-25 09:48 编辑

下载地址:https://github.com/SDWebImage/SDWebImage

在使用SDWebImage加载图片时,尤其是加载gif等大图时,SDWebImage会将图片缓存在内存中,这样是非常吃内存的,这时我们能要在适当的时候去释放一下SDWebImage的内存缓存,才不至于造成APP闪退。

SDWebImage提供了UIImageView、UIButton、MKAnnotationView的图片下载分类,只要一行代码就可以实现图片异步下载和缓存功能。

SDWebImage的使用

1.UITableView中使用UIImageView+WebCache

[Objective-C] 纯文本查看 复制代码
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];


2.使用回调blocks

在block中得到图片下载进度和图片加载完成(下载完成或者读取缓存)的回调,如果你在图片加载完成前取消了请求操作,就不会收到成功或失败的回调

[Objective-C] 纯文本查看 复制代码
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                      placeholderImage:[UIImage imageNamed:@"placeholder.png"]
                             completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
                                 ... completion code here ...
                             }];


3.SDWebImageManager的使用

UIImageView(WebCache)分类的核心在于SDWebImageManager的下载和缓存处理,SDWebImageManager将图片下载和图片缓存组合起来了。SDWebImageManager也可以单独使用。

[Objective-C] 纯文本查看 复制代码
SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager loadImageWithURL:imageURL
                      options:0
                     progress:^(NSInteger receivedSize, NSInteger expectedSize) {
                         // progression tracking code
                     }
                    completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
                        if (image) {
                            // do something with image
                        }
                    }];


4.单独使用SDWebImageDownloader异步下载图片

我们还可以单独使用SDWebImageDownloader来下载图片,但是图片内容不会缓存。

[Objective-C] 纯文本查看 复制代码
SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader];
[downloader downloadImageWithURL:imageURL
                             options:0
                            progress:^(NSInteger receivedSize, NSInteger expectedSize) {
                                // progression tracking code
                            }
                           completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
                               if (image && finished) {
                                   // do something with image
                               }
                           }];


5.单独使用SDImageCache异步缓存图片

SDImageCache支持内存缓存和异步的磁盘缓存(可选),如果你想单独使用SDImageCache来缓存数据的话,可以使用单例,也可以创建一个有独立命名空间的SDImageCache实例。

添加缓存的方法:

[Objective-C] 纯文本查看 复制代码
[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey];


默认情况下,图片数据会同时缓存到内存和磁盘中,如果你想只要内存缓存的话,可以使用下面的方法:

[Objective-C] 纯文本查看 复制代码
[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey toDisk:NO];


读取缓存时可以使用queryDiskCacheForKey:done:方法,图片缓存的key是唯一的,通常就是图片的absolute URL。

[Objective-C] 纯文本查看 复制代码
SDImageCache *imageCache = [[SDImageCache alloc] initWithNamespace:@"myNamespace"];
[imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image) {
        // image is not nil if image was found
    }];


6.自定义缓存 key

有时候,一张图片的URL中的一部分可能是动态变化的(比如获取权限上的限制),所以我们只需要把URL中不变的部分作为缓存用的key。

[Objective-C] 纯文本查看 复制代码
SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) {
            url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path];
            return [url absoluteString];
        };



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2018-12-25 09:48:56 | 显示全部楼层
SDWebImage特点

1.提供UIImageView,UIButton,MKAnnotationView的分类,用来显示网络图片,以及缓存管理
2.异步下载图片
3.异步缓存(内存+磁盘),并且自动管理缓存有效性
4.后台图片解压缩
5.同一个URL不会重复下载
6.自动识别无效URL,不会反复重试
7.不阻塞线程
8.高性能
9.使用GCD和ARC
10.支持多种图片格式(包括WebF格式)
11.支持动图(GIF)
12.4.0版本以后基于FLAnimatedImage加载动图
 楼主| 发表于 2018-12-25 09:48:57 | 显示全部楼层
本帖最后由 竹林风 于 2018-12-25 09:48 编辑

常见问题:

问题1:使用UITableViewCell中的imageView加载不同尺寸的网络图片时会出现尺寸缩放问题。

解决方法:自定义UITableViewCell,重写-layoutSubviews方法,调整位置尺寸;
                  或者直接弃用 UITableViewCell的imageView,自己添加一个imageView作为子控件。

问题2:图片刷新问题:SDWebImage在进行缓存时忽略了所有服务器返回的caching control设置,并且在缓存时没有做时间限制,这也就意味着图片URL必须是静态的了,要求服务器上一个URL对应的图片内容不允许更新。但是如果存储图片的服务器不由自己控制,也就是说图片内容更新了,URL却没有更新,这种情况怎么办?

解决方法:在调用sd_setImageWithURL:placeholderImage: option:方法时设置options参数为SDWebImageRefreshCached,这样虽然会降低性能,但是下载图片时会照顾到服务器返回的caching control。

问题3:在加载图片时,如何添加默认的progress indicator?

解决方法:在调用-sd_setImageWithURL:方法之前,先调用下面的方法:

[Objective-C] 纯文本查看 复制代码
[imageView sd_setShowActivityIndicatorView:YES];
  [imageView sd_setIndicatorStyle:UIActivityIndicatorViewStyleGray];

发表于 2018-12-25 10:02:19 | 显示全部楼层
我只是路过打酱油的。
发表于 2018-12-25 17:25:35 | 显示全部楼层
强烈支持楼主ing……
发表于 2018-12-27 13:45:18 | 显示全部楼层
我只是路过打酱油的。
发表于 2018-12-29 08:32:30 | 显示全部楼层
我只是路过打酱油的。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-23 01:53

© 2014-2021

快速回复 返回顶部 返回列表