猫猫学iOS(五十五)多线程网络之图片下载框架之SDWebImage

猫猫分享,必须精品

原创文章,欢迎转载。转载请注明:翟乃玉的博客

地址: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内部实现过程

  1. 入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片。

    1. 进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache 从缓存查找图片是否已经下载 queryDiskCacheForKey:delegate:userInfo:.
    2. 先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。
    3. SDWebImageManagerDelegate 回调 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片。
    4. 如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。
    5. 根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:。
    6. 如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。
    7. 如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:。
    8. 共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片。
    9. 图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。
    10. connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果。
    11. connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理。
    12. 图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。
    13. 在主线程 notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader。
    14. imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成。
    15. 通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。
    16. 将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程。
    17. SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。
    18. SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。
    19. SDWebImagePrefetcher 可以预先下载图片,方便后续使用。

第三方框架的使用建议

1.用第三方框架的目的

a: 开发效率:快速开发,人家封装好的一行代码顶自己写的N行

b: 为了使用这个功能最牛逼的实现

2.第三方框架过多,很多坏处(忽略不计)

a: 管理、升级、更新

b: 第三方框架有BUG,等待作者解决

c: 第三方框架的作者不幸去世、停止更新(潜在的BUG无人解决)

d: 感觉:自己好水

比如在流媒体:播放在线视频、音频(边下载边播放)等需求上。

如果自己做需要我们非常了解音频、视频文件的格式。并且每一种视频都有自己的解码方式(C\C++),这真的很难,没有几年的深入研究真的没啥结果

4.总结

1> 站在巨人的肩膀上编程

2> 没有关系,使劲用那么比较稳定的第三方框架

ps:(SDWebImage内部实现过程引用了6duxz博客部分素材来自传智黑马的ppt)

ps2:博客内容很多事人家的上课内容,但是每一笔每一画都是猫猫认真整理出来的,目的是为了方便自己复习,如果你也想学,很欢迎来交朋友。

时间: 2024-12-28 21:30:01

猫猫学iOS(五十五)多线程网络之图片下载框架之SDWebImage的相关文章

(素材源码)猫猫学IOS(十五)UI之曾经大热的打砖块小游戏

猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8555567 原文地址:http://blog.csdn.net/u013357243?viewmode=contents !素材代码里面有我写的全部代码,注释齐全,方便学习 先看效果图 ps:新建iOS交流学习群:304570962 可以加猫猫QQ:1764541256 或则微信znycat 让我们一起努力学习吧. 原文:http://blog.csdn.net/u0133

猫猫学IOS(十五)UI之曾经大热的打砖块小游戏

猫猫分享,必须精品 素材代码地址:http://blog.csdn.net/u013357243/article/details/44814523 原文地址:http://blog.csdn.net/u013357243?viewmode=contents !素材代码里面有我写的全部代码,注释齐全,方便学习 先看效果图 代码 //ps:新建iOS交流学习群:304570962 可以加猫猫QQ:1764541256 或则微信znycat 让我们一起努力学习吧. 原文:http://blog.csd

猫猫学iOS(五十)多线程网络之GCD简单介绍(任务,队列)

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents GCD简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为"牛逼的中枢调度器" 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务

猫猫学iOS(五十一)多线程网络之GCD下载合并图片_队列组的使用

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 合并图片(图片水印)第一种方法 效果 实现: 思路: 1.分别下载2张图片:大图片.LOGO 2.合并2张图片 3.显示到一个imageView身上 // 异步下载 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

猫猫学IOS(十六)UI之XIB自定义Cell实现团购UI

猫猫分享,必须精品 素材代码地址:http://blog.csdn.net/u013357243/article/details/44926809 原文地址:http://blog.csdn.net/u013357243?viewmode=contents 先看效果图 自定义Cell 本次主要是自定义Cell的学习 实现自定义Cell主要有三种方法:按照使用的频繁度排序: XIB > 纯代码 > StoryBoard XIB的定义步骤 1> 新建HMTgCell.xib 2> 拽一

(素材源码)猫猫学IOS(十六)UI之XIB自定义Cell实现团购UI

猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8572001 原文地址:http://blog.csdn.net/u013357243?viewmode=contents 先看效果图 自定义Cell 本次主要是自定义Cell的学习 实现自定义Cell主要有三种方法:按照使用的频繁度排序: XIB > 纯代码 > StoryBoard XIB的定义步骤 1> 新建HMTgCell.xib 2> 拽一个需要自定义

猫猫学IOS(十二)UI之UITableView学习(上)LOL英雄联盟练习

猫猫分享,必须精品 素材代码地址:http://blog.csdn.net/u013357243/article/details/44706671 原文地址:http://blog.csdn.net/u013357243?viewmode=contents 先看效果图 源代码 NYViewController的代码 //ps:新建iOS交流学习群:304570962 可以加猫猫QQ:1764541256 或则微信znycat 让我们一起努力学习吧. 原文:http://blog.csdn.net

(素材源码) 猫猫学IOS(十二)UI之UITableView学习(上)LOL英雄联盟练习

猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8542789 原文地址:http://blog.csdn.net/u013357243?viewmode=contents 先看效果图 ps:新建iOS交流学习群:304570962 可以加猫猫QQ:1764541256 或则微信znycat 让我们一起努力学习吧. 原文:http://blog.csdn.net/u013357243?viewmode=contents

猫猫学IOS(十八)UI之QQ聊天布局_键盘通知实现自动弹出隐藏_自动回复

猫猫分享,必须精品 素材代码地址:http://blog.csdn.net/u013357243/article/details/45000699 原文地址:http://blog.csdn.net/u013357243?viewmode=contents 先看图片 第一步完成tableView和Cell的架子的图 完善图片 键盘弹出设置后图片: 自动回复图: 粗狂的架子 tableView和Cell的创建 首相tableView为了学习方便就直接用stroyBoard拖拽了,包括一些学习意义不