iOS使用UIImageView展现网络图片(转载)
在iOS开发过程中,经常会遇到使用UIImageView展现来自网络的图片的情况,最简单的做法如下:
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- self.imageView = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)] autorelease];
- self.imageView.layer.masksToBounds = YES;
- self.imageView.layer.cornerRadius = 5.0f;
- [self.imageView setBackgroundColor:[UIColor grayColor]];
- [self.view addSubview:self.imageView];
- NSURL *imageUrl = [NSURL URLWithString:IMAGE_URL];
- UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageUrl]];
- self.imageView.image = image;
- }
这么做,最直接的问题就是阻塞UI线程了。
于是考虑利用NSOperationQueue来异步加载图片:
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- operationQueue = [[NSOperationQueue alloc] init];
- self.imageView = [[[UIImageView alloc] initWithFrame:CGRectMake(110, 50, 100, 100)] autorelease];
- self.imageView.layer.masksToBounds = YES;
- self.imageView.layer.cornerRadius = 5.0f;
- [self.imageView setBackgroundColor:[UIColor grayColor]];
- [self.view addSubview:self.imageView];
- NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage) object:nil];
- [operationQueue addOperation:op];
- }
- - (void)downloadImage
- {
- NSURL *imageUrl = [NSURL URLWithString:IMAGE_URL];
- UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageUrl]];
- self.imageView.image = image;
- }
这么做的话,就可以避免阻塞UI线程了。当图片异步加载完成后,就会展现出来。
但是,第二次进入该界面,还是要重新下载图片,用户体验不好,且浪费资源(比如耗电)。
于是,考虑缓存已经下载的图片。
模仿操作系统(Cache - Memory - Disk),缓存图片也可以采取两层模型:内存和磁盘。
保存到内存中比较简单,只需要用NSDictionary来维护即可。而保存到磁盘,涉及到本地文件读写,可以参考“文件和数据管理”。
首先需要创建一个缓存目录:
- NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
- diskCachePath = [[[paths objectAtIndex:0] stringByAppendingPathComponent:@"ImageCache"] retain];
- if (![[NSFileManager defaultManager] fileExistsAtPath:diskCachePath]) {
- NSError *error = nil;
- [[NSFileManager defaultManager] createDirectoryAtPath:diskCachePath
- withIntermediateDirectories:YES
- attributes:nil
- error:&error];
- }
接着可以用图片名称或者URL或者hash过后的值作为key(本地文件名),写入到本地:
- if (![[NSFileManager defaultManager] fileExistsAtPath:localPath]) {
- [[NSFileManager defaultManager] createFileAtPath:localPath contents:localData attributes:nil];
- }
这样,在每次下载图片之前,先判断是否已经有缓存了,可以优化体验和性能。
iOS使用UIImageView展现网络图片(转载)的更多相关文章
- 【推荐】iOS带有加载网络图片进度的UIImageView
UCZProgressView 是一个带有通用的圆形图片进度下载控件.动画效果不错 特性 Customizable indicator (line width, radius, and color) ...
- IOS的各种控件(转载,防止遗忘)
UITextView控件的详细讲解 感觉写的相当不错,而且很全就直接转载了 1.创建并初始化 创建UITextView的文件,并在.h文件中写入如下代码: #import <UIKit/UIKi ...
- 最全的iOS面试题及答案-转载
1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承:可以实现多个接口,通过实现 ...
- ios 消息推送流程 转载
iOS开发:推送通知简述及开发实践热度 1已有 706 次阅读 2013-10-15 09:23 |个人分类:经验之谈|系统分类:ios| IOS, 推送一.关于推送通知 推送通知,也被叫做远程通知, ...
- iOS模拟器分辨率的问题(转载)
转载地址:http://justsee.iteye.com/blog/2123545 不积跬步 无以至千里 不积小流 无以成江海 博客 微博 相册 收藏 留言 关于我 ios8/sdk ...
- IOS 多于UIImageView 当加载较大的高清闪存管理
当我们是一家人View 多于UIImageView,和UIImageView表明一个更大的HD,可能存在的存储器的警告的问题.假设第一次走进这个view,无记忆出现预警.当重新进入view,在那曾经 ...
- iOS开发-UIImageView高效设置Radius
圆角的设置在iOS中随处可见,开发的时候也很方便,但是有的时候如果一个页面有大量的需要设置圆角的图片,容易产生性能问题,UIImageView ios9.0之前设置圆角是会产生离屏渲染的,9.0之后不 ...
- 使用UIImageView展现来自网络的图片
本文转载至 http://www.cnblogs.com/chivas/archive/2012/05/21/2512324.html UIImageView:可以通过UIImage加载图片赋给UII ...
- iOS中UIImageView的填充模式
UIImageView的填充模式 属性名称 imageV.contentMode枚举属性: @"UIViewContentModeScaleToFill", // 拉伸自适应填满整 ...
随机推荐
- Tomcat报错:Java.long.nullpointerException,详细是resp.getwriter.write报错
报错原因: 空指针 在out.write(name);时,name不能为null,哪怕你随便给name赋值为xxoo啥的都可以,不要为null 改正:String name = "fail& ...
- selenium之python源码解读-WebDriverWait
一.显示等待 所谓显示等待,是针对某一个特定的元素设置等待时间,如果在规定的时间内找到了该元素,就执行相关的操作,如果在规定的时间内没有找到该元素,在抛出异常 PS:注意显示等待和隐身等待的区别,隐身 ...
- ModelAndView返回Json格式的数据
第一种方式: 1.自定义类JacksonUtil.java,类中实现tojson方法(即将数据转成json类型): 2.自定义类JsonView 继承 AbstractView 3.xml中配置bea ...
- 简单聊一下对MySQL索引的理解?
一.索引是什么? 索引是帮助MySQL高效获取数据的数据结构. 二.索引能干什么? 索引非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要. 索引能够轻易将查询性能提高好几个数量级, ...
- [Angular] Lazy Load CSS at runtime with the Angular CLI
Ever had the need for multiple "app themes", or even to completely dynamically load CSS ba ...
- @select注解中可以用条件构造器
https://mp.baomidou.com/guide/wrapper.html#lambda https://blog.csdn.net/weixin_42236404/article/deta ...
- idea项目打包和在linux的部署
1.将项目打包 2.先clean,后package 3.将打好的包上传到linux 使用cd指令到要上传的文件的目录 4.输入rz -y 5.解压tar.gz格式: tar -zxvf filenam ...
- VsCode安装Go的相关插件
今天在学习Go的时候,安装Go的相关插件,显示安装不上,但是右下角也一直会提示让你安装,当然你可以设置成忽略,为了开发效率,我选择了安装.然后出现了问题,一直Failed.在网上看到了很多的文章,不是 ...
- 使用dig进行DNS查询
dig全称Domain Information Groper,是一个DNS域名信息查询的工具,可以使用来查看域名解析的过程. dig是linux下自带的工具,如果要在windows下使用需要自行下载和 ...
- RESTful入门
RESTful入门 1. REST简介 和RPC一样,都是目前比较主流的URL链接风格,也可以说是web服务的一种架构风格.REST全称Representational State Transfer, ...