iOS如何获取网络图片(二)

时间:2022-09-24 11:22:04

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如何获取网络图片(二)的更多相关文章

  1. iOS如何获取网络图片(三)有沙盒的

    沙盒 沙盒简介 默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp.因为应用的沙盒机制,应用只能在几个目录下读写文件 Documents:苹果建议将程序中建立的或在程 ...

  2. iOS如何获取网络图片(一)

    static NSString * baseUrl = @"http://192.168.1.123/images/"; - (UITableViewCell *)tableVie ...

  3. [转载] IOS 获取网络图片的大小 改变 图片色值 灰度什么的方法集合

    IOS 获取网络图片的大小 改变 图片色值 灰度什么的方法集合

  4. iOS 获取网络图片的大小

    一直都在找关于获取网络图片的大小的方法, 今天找到了一个能解决的办法 ,如下 1, 导入框架 #import <ImageIO/ImageIO.h> 2. 使用此方法得到image的siz ...

  5. iOS开发-定制多样式二维码

    iOS开发-定制多样式二维码   二维码/条形码是按照某种特定的几何图形按一定规律在平台(一维/二维方向上)分布的黑白相间的图形纪录符号信息.使用若干个与二进制对应的几何形体来表示文字数值信息. 最常 ...

  6. IOS开发-文件管理(二)

    IOS开发-文件管理(二) 五.Plist文件 String方式添加               NSString *path = [NSHomeDirectory( )  stringByAppen ...

  7. iOS 相册和网络图片的存取

    iOS 相册和网络图片的存取 保存 UIImage 到相册 UIKit UIKit 中一个古老的方法,Objective-C 的形式 void UIImageWriteToSavedPhotosAlb ...

  8. iOS中获取本地通讯录联系人以及汉字首字母排序

    iOS中获取手机通讯录中的联系人信息: /*** 加载本地联系人*/ - (void)loadLocalContacts { //新建一个通讯录类 ABAddressBookRef addressBo ...

  9. &lbrack;转&rsqb;Android 如何根据网络地址获取网络图片方法

    http://blog.csdn.net/xiazdong/article/details/7724103 目录(?)[-] h2pre namecode classhtml stylefont-we ...

随机推荐

  1. input&lbrack;tyle&equals;&quot&semi;file&quot&semi;&rsqb;样式修改及上传文件名显示

    默认的上传样式我们总觉得不太好看,根据需求总想改成和上下结构统一的风格…… 实现方法和思路: 1.在input元素外加a超链接标签 2.给a标签设置按钮样式 3.设置input[type='file' ...

  2. Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信

    以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3360938.html 如新浪微博下面的标签切换功能,我以前也写过一篇博文(http:/ ...

  3. 无法识别的属性&OpenCurlyDoubleQuote;targetFramework”的解决方法

    本文导读:网站发布后,在IIS中浏览的时候出现以下异常:无法识别的属性“targetFramework”,请注意属性名称区分大小写.出现这个问题是由IIS配置该站点的.NET Framework 版本 ...

  4. java 集合(ArrayList)

    ArrayList: ------------|Collection 单列集合的跟接口 ----------------------|List  有序,可重复. ------------------- ...

  5. WEB实时聊天 comet推技术

    转自:http://www.cnblogs.com/wodemeng/archive/2012/04/06/2435302.html 今天晚上朋友遇到web服务端推技术的问题,自己就查了下资料,学习了 ...

  6. Linux时间与Windows差8个时区的问题解决方法

    我的Debian7.1的时间与windows上的时间不一致,正好差8个时区,原因是Debian将机器的物理时间理解为UTC时间了.去网上找了好多文章,基本上都是说要改/etc/default/rcS, ...

  7. TPL中的task并不是thread

    Tasks are not Threads - The Brain Dump用了一个非常简单直观的例子说明了task和thread并不是一回事(尽管你调用Task.Run一般会在线程池上启一个线程帮你 ...

  8. Mongo Index

    摘要 mongo 的索引非常强大,和关系型数据库索引没什么区别.这里主要介绍本人在mongo索引上的犯的错. 索引种类 1.单字段索引 2.复合索引 多个字段索引 如{name:1,address:1 ...

  9. python开发工具

    要用到爬虫,网上推荐crapy,自己在pycharm上没有安装成功,于是使用anaconda,但是在gui界面安装crapy总是失败,且没有提示信息.于是使用命令行的方式,提示PermissionEr ...

  10. Qt QTextEdit根据行号移动光标

    QTextEdit* p = new QTextEdit; QTextBlock block = p->document()->findBlockByNumber(nLineNum); p ...