iOS 用GCD下载网络图片方法
2015-08-08 22:12
411 查看
用多线程下载网络图片会导致重复下载浪费流量的问题。
以免出现以上情况,用多线程下载图片方法可以用以下方法。
1.创建一个字典,如果下载了该图片则将用图片地址为key,图片为value保存。
2.创建一个字典,如果子线程已开始下载则用图片地址为key,图片地址为value保存。
3.如果正在下载中,显示占位图片
4.如果字典中有下载的图片,则刷新图片
//属性
//懒加载
//点击屏幕开始下载
//下载图片操作
//下载图片完成后回到主线程刷新图片
//运行效果
//为了测试防止重复下载操作,在开始下载时连续猛击多次屏幕
---end
注:如果想了解用NSOperation来下载,请查看http://blog.csdn.net/zhangwenhai001/article/details/46723597
以免出现以上情况,用多线程下载图片方法可以用以下方法。
1.创建一个字典,如果下载了该图片则将用图片地址为key,图片为value保存。
2.创建一个字典,如果子线程已开始下载则用图片地址为key,图片地址为value保存。
3.如果正在下载中,显示占位图片
4.如果字典中有下载的图片,则刷新图片
//属性
@interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageViewOutlet; @property (nonatomic, strong) NSMutableDictionary *imageDict; @property (nonatomic, strong) NSMutableDictionary *dispatchDict; @property (nonatomic, assign) dispatch_queue_t globalQueue; @property (nonatomic, assign) dispatch_group_t dispatchGroup; @property (nonatomic, strong) NSData *imageData; @end
//懒加载
- (NSMutableDictionary *)imageDict { if (!_imageDict) { _imageDict = [NSMutableDictionary dictionary]; } return _imageDict; } - (NSMutableDictionary *)dispatchDict { if (!_dispatchDict) { _dispatchDict = [NSMutableDictionary dictionary]; } return _dispatchDict; } - (dispatch_queue_t)globalQueue { if (!_globalQueue) { _globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); } return _globalQueue; }
//点击屏幕开始下载
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self dispatchGroupAsync]; }
//下载图片操作
- (void)dispatchGroupAsync { dispatch_group_t dispatchGroup = dispatch_group_create(); NSString *imageName = @"http://pic29.nipic.com/20130424/11921802_221046126000_2.jpg"; UIImage *image = self.imageDict[imageName]; //字典中没有图片 if (image == nil) { NSLog(@"image is nil"); NSString *dispatchName = self.dispatchDict[imageName]; //也没下载中 if (dispatchName == nil) { NSLog(@"dispatch is nil"); dispatch_group_async(dispatchGroup, self.globalQueue, ^{ //添加线程字典中 self.dispatchDict[imageName] = imageName; NSURL *url = [NSURL URLWithString:imageName]; self.imageData = [NSData dataWithContentsOfURL:url]; }); dispatch_group_notify(dispatchGroup, self.globalQueue, ^{ NSLog(@"dispatch_group_notify queue finished!"); [self.dispatchDict removeObjectForKey:imageName]; self.imageDict[imageName] = self.imageData; [self performSelectorOnMainThread:@selector(refreshImage) withObject:nil waitUntilDone:YES]; }); } //还在下载中 else { self.imageViewOutlet.image = [UIImage imageNamed:@"dufault.jpg"]; } } //有已经下载图片 else { NSLog(@"刷新图片"); self.imageViewOutlet.image = [UIImage imageWithData:self.imageDict[imageName] scale:0.0]; } }
//下载图片完成后回到主线程刷新图片
- (void)refreshImage { self.imageViewOutlet.image = [UIImage imageWithData:self.imageData scale:0.0]; }
//运行效果
//为了测试防止重复下载操作,在开始下载时连续猛击多次屏幕
2015-08-08 22:02:18.055 GCD下载图片[2840:163865] image is nil 2015-08-08 22:02:18.055 GCD下载图片[2840:163865] dispatch is nil 2015-08-08 22:02:18.235 GCD下载图片[2840:163865] image is nil 2015-08-08 22:02:18.403 GCD下载图片[2840:163865] image is nil 2015-08-08 22:02:18.560 GCD下载图片[2840:163865] image is nil 2015-08-08 22:02:18.704 GCD下载图片[2840:163865] image is nil 2015-08-08 22:02:18.874 GCD下载图片[2840:163960] dispatch_group_notify queue finished! 2015-08-08 22:02:18.890 GCD下载图片[2840:163865] 刷新图片 2015-08-08 22:02:19.495 GCD下载图片[2840:163865] 刷新图片
---end
注:如果想了解用NSOperation来下载,请查看http://blog.csdn.net/zhangwenhai001/article/details/46723597
相关文章推荐
- UVa 563 Crimewave (网络流构图+最大流+挺好的+双向边)
- 五层网络体系结构
- HDU 4940 Destroy Transportation system(上下界网络流)
- 网络编程学习总结(之client/server模型)
- 网络编程学习总结(之client/server模型)
- [转]数据中心网络虚拟化 隧道技术
- 网络信息安全攻防实验室之基础关
- Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/sc
- Java网络编程
- 【python网络编程】新浪爬虫:关键词搜索爬取微博数据
- 关于android-async-http的使用,封装网络请求
- 微信分享文本、图片(本地、二进制、网络图片)、音频、视频、Gif动态图片、网页信息--大汇总
- “TCP:三次握手”分析——以一个简单的“服务器”和“客户端”为例
- Android 网络:基于TCP协议通信,多线程,实现简单的C/S聊天室
- hdu 4807(网络流 + 贪心)
- tinyhttpd简介
- 申请https证书需要注意的4大问题
- HTTP2协议之HPACK--之头部压缩规范介绍
- https原理及tomcat配置https方法
- 企业中web服务http网站的搭建和配置