iOS如何获取网络图片(二)
ios如何获取图片(二)无沙盒下
解决问题
*解决问题1:tableView滑动卡顿,图片延时加载
解决方法:添加异步请求,在子线程里请求网络,在主线程刷新UI
*解决问题2:反复请求网络图片,增加用户流量消耗
解决方法:创建了downloadImage,downloadImage属于数据源,当tableview滚动的时候就可以给cell的数据赋值,运用了MVC设计方式
*解决问题3:当没有请求到图片时,留白影响用户体验,图片还会延时刷新
解决方法:添加默认图片
*解决问题4:当该cell的网络请求未执行完,又滚动到了该cell,会导致网络请求重复
解决方法:创建网络请求缓冲池
*解决问题5:当出现数量较多的图片时,防止内存使用过多,耦合性大
解决方法:创建图片缓冲池
代码如下图
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
SXTShopCell * cell = [tableView dequeueReusableCellWithIdentifier:identifier];
SXTShop * shop = self.dataList[indexPath.row];
cell.shop = shop;
//为了避免重复加载的问题,创建了downloadImage,downloadImage属于数据源,当tableview滚动的时候就可以给cell的数据赋值
//从图片缓冲池里找到对应的图片
if ([self.imageCache objectForKey:shop.shop_image]) {
//如果下载过,直接从内存中获取图片
cell.iconView.image = shop.downloadImage;
cell.iconView.image = self.imageCache[shop.shop_image];
} else {
//设置默认图片
cell.iconView.image = [UIImage imageNamed:@"defaultImage"];
[self downloadImage:indexPath];
}
return cell;
}
- (void)downloadImage:(NSIndexPath *)indexPath {
SXTShop * shop = self.dataList[indexPath.row];
if ([self.operationDict objectForKey:shop.shop_image]) {
NSLog(@"已经请求过了,请等待下载");
} else {
//如果未下载过,开启异步线程
NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
//模拟网络延时
[NSThread sleepForTimeInterval:1];
//通过url获取网络数据
NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",baseUrl,shop.shop_image]]];
//将数据装换为图片
UIImage * image = [UIImage imageWithData:data];
//如果有图片
if (image) {
//通知model,将图片赋值给downloadImage,以便下次从内存获取
// shop.downloadImage = image;
//将图片作为value,将url作为key
[self.imageCache setObject:image forKey:shop.shop_image];
//获取主队列,更新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//刷新第indexPath单元的表格
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
}];
}
}];
//将请求加入操作缓冲池中
[self.operationDict setObject:op forKey:shop.shop_image];
//将请求加入全局队列
[self.queue addOperation:op];
}
}
//当内存发生警报时,调用
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
[self.imageCache removeAllObjects];
[self.operationDict removeAllObjects];
[self.queue cancelAllOperations];
}
iOS如何获取网络图片(二)的更多相关文章
- iOS如何获取网络图片(三)有沙盒的
沙盒 沙盒简介 默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp.因为应用的沙盒机制,应用只能在几个目录下读写文件 Documents:苹果建议将程序中建立的或在程 ...
- iOS如何获取网络图片(一)
static NSString * baseUrl = @"http://192.168.1.123/images/"; - (UITableViewCell *)tableVie ...
- [转载] IOS 获取网络图片的大小 改变 图片色值 灰度什么的方法集合
IOS 获取网络图片的大小 改变 图片色值 灰度什么的方法集合
- iOS 获取网络图片的大小
一直都在找关于获取网络图片的大小的方法, 今天找到了一个能解决的办法 ,如下 1, 导入框架 #import <ImageIO/ImageIO.h> 2. 使用此方法得到image的siz ...
- iOS开发-定制多样式二维码
iOS开发-定制多样式二维码 二维码/条形码是按照某种特定的几何图形按一定规律在平台(一维/二维方向上)分布的黑白相间的图形纪录符号信息.使用若干个与二进制对应的几何形体来表示文字数值信息. 最常 ...
- IOS开发-文件管理(二)
IOS开发-文件管理(二) 五.Plist文件 String方式添加 NSString *path = [NSHomeDirectory( ) stringByAppen ...
- iOS 相册和网络图片的存取
iOS 相册和网络图片的存取 保存 UIImage 到相册 UIKit UIKit 中一个古老的方法,Objective-C 的形式 void UIImageWriteToSavedPhotosAlb ...
- iOS中获取本地通讯录联系人以及汉字首字母排序
iOS中获取手机通讯录中的联系人信息: /*** 加载本地联系人*/ - (void)loadLocalContacts { //新建一个通讯录类 ABAddressBookRef addressBo ...
- [转]Android 如何根据网络地址获取网络图片方法
http://blog.csdn.net/xiazdong/article/details/7724103 目录(?)[-] h2pre namecode classhtml stylefont-we ...
随机推荐
- angularJs指令深度分析
AngularJs的指令定义大致如下 angular.module("app",[]).directive("directiveName",function() ...
- 四、BLE(中)
1.1 GATT Manager GATT MGR模块管理所有的GATT服务,同时也是连接GATT模块与GATT ServiceS模块的桥梁. 1.1.1 主要功能模块 先来看一张该 ...
- 近期总结:generator-web,前端自动化构建的解决方案
本文结合最近的工作经验,总结出一个较简洁的前端自动化构建方案,主张css和js的模块化,并通过grunt的自动化构建,有效地解决css合并,js合并和图片优化等问题,对于提高前端性能和项目代码质量有一 ...
- C#密封类
密封类 密封类使用sealed修饰符声明. 密封类中不可能有抽象方法[因为:抽象方法必须在抽象类中,而抽象类不能是密封的或者是静态的,也就是说abstract 和sealed不能同时修饰一个类] ...
- 介绍开源的.net通信框架NetworkComms框架 源码分析(一)ConnectionState
原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ...
- echarts 折线图动态x轴及数据
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...
- 【原创】asp.net导出word 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 8000401a
我的服务器:windows server 2008(64位)+microsoft office 2007 企业版 业务:网站导出应聘word简历. 出现以下错误: 检索 COM 类工厂中 CLSID ...
- [教学] Firemonkey 之 StringGrid Header 自订显示
StringGrid Header 高度设定方法: uses FMX.Header; procedure TForm1.StringGrid1ApplyStyleLookup(Sender: TObj ...
- Oracle 数据库基础学习 (四) group by的使用
group by分组查询 示例:要求查询出每个部门的编号,人数,以及最高和最低工资 select deptno, count(empno), max(sal), min(sal) from em ...
- 实用的Scala泛函编程
既然谈到实用编程,就应该不单止了解试试一个新的编程语言那么简单了,最好通过实际的开发项目实例来演示如何编程.心目中已经有了一些设想:想用Scala泛函编程搞一个开源的数据平台应用系统,也就是在云平台P ...