网络图片加载框架:
SDWebImage
支持从网络中下载且缓存图片,并设置图片到对应的 UIImageView 控件或者 UIButton 控件。
对 UIImage 、UIView 、UIImageView 、UIButton 、进行了扩展
1.提供了一个 UIImageView 的 category 用来加载网络图片并且对网络图片的缓存进行管理
2.采用异步方式来下载网络图片
3.采用异步方式,使用 memory+disk 来缓存网络图片,自动管理缓存。
4.支持 GIF 动画
5.支持 WebP 格式
6.同一个 URL 的网络图片不会被重复下载
7.失效的 URL 不会被无限重试
8.耗时操作都在子线程,确保不会阻塞主线程
9.使用 GCD 和 ARC
10.支持 Arm64
类引用有5个 分别是以下几个 :
SDImageCache 图片异步缓存
SDWebImageDownloader 图片异步下载
SDWebImageDownloaderOperation Class Reference 图片异步下载操作
SDWebImageManager 图片管理
SDWebImagePrefetcher图片预处理
SDWebImage 使用:
1.使用 ImageView+WebCache category 来加载 UITableView 中 cell 的图片
[cell.imageView sd_setImageWithURL: placeholderImage: ];
2.使用 block,采用这个方案可以在网络图片加载过程中得知图片的下载进度和图片加载成功与否
[cell.imageView sd_setImageWithURL: placeholderImage: completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
//... completion code here ...
}];
3.单独使用 SDWebImageManager,SDWebImageManager 为UIImageView+WebCache category 的实现提供接口。
SDWebImageManager *manager = [SDWebImageManager sharedManager] ;
[manager downloadImageWithURL: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 和 SDImageCache 方式
单独使用 SDImageCache 异步缓存图片
获取 SDWebImage 的磁盘缓存大小:
[SDImageCache sharedImageCache] getSize];
清理内存缓存,清理内存中缓存的图片资源,释放内存资源。
[[SDImageCache sharedImageCache] clearMemory];
有了清理内存缓存,自然也有清理磁盘缓存的接口
[[SDImageCache sharedImageCache] clearDisk];
SDWebImage 加载图片流程
- 常见问题
问题 1:使用 UITableViewCell 中的 imageView 加载不同尺寸的网络图片时会出现尺寸缩放问题
解决方案:自定义 UITableViewCell,重写 -layoutSubviews 方法,调整位置尺寸;或者直接弃用 UITableViewCell 的 imageView,自己添加一个 imageView 作为子控件。
问题 2:图片刷新问题:SDWebImage 在进行缓存时忽略了所有服务器返回的 caching control 设置,并且在缓存时没有做时间限制,这也就意味着图片 URL 必须是静态的了,要求服务器上一个 URL 对应的图片内容不允许更新。但是如果存储图片的服务器不由自己控制,也就是说 图片内容更新了,URL 却没有更新,这种情况怎么办?
解决方案:在调用 sd_setImageWithURL: placeholderImage: options:方法时设置 options 参数为 SDWebImageRefreshCached,这样虽然会降低性能,但是下载图片时会照顾到服务器返回的 caching control。
问题 3:在加载图片时,如何添加默认的 progress indicator ?
解决方案:在调用 -sd_setImageWithURL:方法之前,先调用下面的方法:
[imageView sd_setShowActivityIndicatorView:YES];
[imageView sd_setIndicatorStyle:UIActivityIndicatorViewStyleGray];
SD依赖 FLAnimatedImage(动画加载框架) 进行了gif的加载
SDWebImage 如何区分图片格式?
将数据data转为十六进制数据,取第一个字节数据进行判断。
SDWebImage 缓存图片的名称如何避免重名?
对『绝对路径』进行MD5 / 对完整的 URL 进行 md5
SDWebImage 的最大并发数 和 超时时长?
// SDWebImageDownloader.m -initWithSessionConfiguration:
_downloadQueue.maxConcurrentOperationCount = 6;
_downloadTimeout = 15.0;
SDWebImage 的Memory警告是如何处理的!
利用通知中心观察
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(clearMemory)
name:UIApplicationDidReceiveMemoryWarningNotification
object:nil];
UIApplicationDidReceiveMemoryWarningNotification 接收到内存警告的通知
执行 clearMemory 方法,清理内存缓存!
SDWebImage Disk缓存时长? Disk清理操作时间点? Disk清理原则?
默认为一周
分别在『应用被杀死时』和 『应用进入后台时』进行清理操作
磁盘清理原则:
清理缓存的规则分两步进行。 第一步先清除掉过期的缓存文件。 如果清除掉过期的缓存之后,空间还不够。 那么就继续按文件时间从早到晚排序,先清除最早的缓存文件,直到剩余空间达到要求。
SDWebImage Disk目录位于哪里?
缓存在沙盒目录下 Library/Caches
参考:
链接:https://www.jianshu.com/p/be9a0a088feb
https://www.jianshu.com/p/b8517dc833c7 //面试题
加载网络图片的简单步骤
网友评论