猫猫学iOS(五十五)多线程网络之图片下载框架之SDWebImage
来源:互联网 发布:唐山网站怎么做seo 编辑:程序博客网 时间:2024/04/20 03:00
猫猫分享,必须精品
原创文章,欢迎转载。转载请注明:翟乃玉的博客
地址:http://blog.csdn.net/u013357243?viewmode=contents
效果:
代码:
- (NSArray *)apps{ if (!_apps) { NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"apps.plist" ofType:nil]]; NSMutableArray *appArray = [NSMutableArray array]; for (NSDictionary *dict in dictArray) { HMApp *app = [HMApp appWithDict:dict]; [appArray addObject:app]; } _apps = appArray; } return _apps;}- (void)viewDidLoad{ [super viewDidLoad];}#pragma mark - 数据源方法- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return self.apps.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *ID = @"app"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; }// 得到数据模型 HMApp *app = self.apps[indexPath.row]; //设置cell的标题 cell.textLabel.text = app.name; //设置cell的下载次数 cell.detailTextLabel.text = app.download; //站位图片 UIImage *place = [UIImage imageNamed:@"57437179_42489b0"]; //用SDWebImage框架一句话解决异步下载,缓存,沙盒缓存等操作,并设置给cell的图片 [cell.imageView setImageWithURL:[NSURL URLWithString:app.icon] placeholderImage:place]; return cell;}
自己实现图片异步下载沙盒缓存等操作的思路图(面试)
SDWebImage
简介:
1:SDWebImage是:iOS中著名的牛逼的网络图片处理框架。
2:包含的功能:图片下载、图片缓存、下载进度监听、gif处理等等。
3:用法极其简单,功能十分强大,大大提高了网络图片的处理效率。
4:国内超过90%的iOS项目都有它的影子。
使用步骤
第一步,下载SDWebImage,导入工程。github托管地址https://github.com/rs/SDWebImage
第二步,在需要的地方导入头文件
#import "UIImageView+WebCache.h"
第三步,调用sd_setImageWithURL:等等方法旧的版本里面都没有sd开头。
二:重点:需要记住的几个常用方法
1 常用方法
//设置下载图片的链接和站位图片- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder;
//设置下载图片的链接和站位图片以及一个选项的集合options- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options;
SDWebImageOptions(上面方法中的options)
* SDWebImageRetryFailed : 下载失败后,会自动重新下载
* SDWebImageLowPriority : 当正在进行UI交互时,自动暂停内部的一些下载操作
* SDWebImageRetryFailed | SDWebImageLowPriority : 拥有上面2个功能
//失败后重试 SDWebImageRetryFailed = 1 << 0, //UI交互期间开始下载,导致延迟下载比如UIScrollView减速。 SDWebImageLowPriority = 1 << 1, //只进行内存缓存 SDWebImageCacheMemoryOnly = 1 << 2, //这个标志可以渐进式下载,显示的图像是逐步在下载 SDWebImageProgressiveDownload = 1 << 3, //刷新缓存 SDWebImageRefreshCached = 1 << 4, //后台下载 SDWebImageContinueInBackground = 1 << 5, //NSMutableURLRequest.HTTPShouldHandleCookies = YES; SDWebImageHandleCookies = 1 << 6, //允许使用无效的SSL证书 //SDWebImageAllowInvalidSSLCertificates = 1 << 7, //优先下载 SDWebImageHighPriority = 1 << 8, //延迟占位符 SDWebImageDelayPlaceholder = 1 << 9, //改变动画形象 SDWebImageTransformAnimatedImage = 1 << 10,
//设置下载图片的链接和站位图片以及完成后执行是么操作 (completed 完成)
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock;
//此方法用来做下载进度条的
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock;
2 内存处理:当app接收到内存警告时
/**
* 当app接收到内存警告
*/
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
SDWebImageManager *mgr = [SDWebImageManager sharedManager];
// 1.取消正在下载的操作[mgr cancelAll];// 2.清除内存缓存[mgr.imageCache clearMemory];
}
3 SDWebImage内部实现过程
- 入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片。
- 进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache 从缓存查找图片是否已经下载 queryDiskCacheForKey:delegate:userInfo:.
- 先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。
- SDWebImageManagerDelegate 回调 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片。
- 如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。
- 根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:。
- 如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。
- 如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:。
- 共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片。
- 图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。
- connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果。
- connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理。
- 图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。
- 在主线程 notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader。
- imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成。
- 通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。
- 将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程。
- SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。
- SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。
- SDWebImagePrefetcher 可以预先下载图片,方便后续使用。
第三方框架的使用建议
1.用第三方框架的目的
a: 开发效率:快速开发,人家封装好的一行代码顶自己写的N行
b: 为了使用这个功能最牛逼的实现
2.第三方框架过多,很多坏处(忽略不计)
a: 管理、升级、更新
b: 第三方框架有BUG,等待作者解决
c: 第三方框架的作者不幸去世、停止更新(潜在的BUG无人解决)
d: 感觉:自己好水
比如在流媒体:播放在线视频、音频(边下载边播放)等需求上。
如果自己做需要我们非常了解音频、视频文件的格式。并且每一种视频都有自己的解码方式(C\C++),这真的很难,没有几年的深入研究真的没啥结果
4.总结
1> 站在巨人的肩膀上编程
2> 没有关系,使劲用那么比较稳定的第三方框架
ps:(SDWebImage内部实现过程引用了6duxz博客部分素材来自传智黑马的ppt)
ps2:博客内容很多事人家的上课内容,但是每一笔每一画都是猫猫认真整理出来的,目的是为了方便自己复习,如果你也想学,很欢迎来交朋友。
- 猫猫学iOS(五十五)多线程网络之图片下载框架之SDWebImage
- AJ学IOS(55)多线程网络之图片下载框架之SDWebImage
- (五十五)iOS多线程之GCD
- iOS 开发 多线程详解之SDWebImage详解
- 网络通信之图片下载
- IOS网络图片缓存之SDWebImage
- iOS 多线程编程<十三、NSOperation图片下载,SDWebImage底层实现原理>
- iOS 多线程编程<十四、SDWebImage图片下载,内存警告处理>
- 开源框架之Picasso进行网络图片下载
- IOS之SDWebImage
- iOS开发之SDWebImage
- iOS开发- SDWebImage图片下载缓存
- iPhone网络图片下载之ABELWebImage
- 网络爬虫之批量图片下载
- IOS 网络浅析-(六 网络图片获取之三方SDWebImage-master)
- 网络多线程-下载图片(不用SDWebImage框架)
- iOS框架研究之SDWebImage的原理以及使用流程
- IOS框架研究之SDWebImage的原理以及使用流程
- fastreport问题集合
- volatile 和 atomic 原子性的区别和联系
- More than one order matters
- 【linux】Ubuntu上的防火墙iptables的基本配置与使用
- 1.2 reverse a C-Style String
- 猫猫学iOS(五十五)多线程网络之图片下载框架之SDWebImage
- html5 父页面调用子页面js方法
- jmap -histo pid 输出的[C [B [I [S methodKlass的含义
- 大众浴室大众难寻 你怎么看?最新大众浴池图片|兴泉大众浴池|东郊大众浴池|丰台区大众浴池加盟
- 前向星
- Hadoop cluster security 1: How to enable HDFS permission ACl
- EntityFramework5.0 批量插入错误
- Spring组件扫描<context:component-scan/>使用详解
- c++ 设计模式之原型模式