使用UIImageView展现来自网络的图片
来源:互联网 发布:小学生的英语软件 编辑:程序博客网 时间:2024/04/28 01:18
在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];
- }
这样,在每次下载图片之前,先判断是否已经有缓存了,可以优化体验和性能。
我把完整的源代码写成Category以重用,放在GitHub上:https://github.com/siqin/OnlineImageView 。
Jason Lee @ Hangzhou
Blog: http://blog.csdn.net/jasonblog
Weibo: @思禽饮霜
0 0
- 使用UIImageView展现来自网络的图片
- 使用UIImageView展现来自网络的图片
- 使用UIImageView展现来自网络的图片
- 使用UIImageView展现来自网络的图片
- 使用UIImageView展现来自网络的图片
- 使用UIImageView展现来自网络的图片
- ios中UIImageView展现图片的不同处理方式
- ios中UIImageView展现图片的不同处理方式
- 来自网络的图片
- IOS中UIImageView使用网络图片
- UIImageView 使用图片的用法
- iphone,UIImageView展现不同途径的图片的不同处理方式
- 使用UIImageView播放图片
- UIImageView异步加载网络图片
- UIImageView异步加载网络图片
- UIImageView异步加载网络图片
- iOS-UIImageView获取网络图片
- 根据网络图片的size大小设置UIImageView的大小
- 开发农村市场是否有助于互联网金融长远发展?
- 常用正则
- hdu 4035 Maze(期望)
- 安装nrpe时提示错误:configure: error: cannot find ssl headers怎么办?
- HSV颜色空间下标示数据类型
- 使用UIImageView展现来自网络的图片
- 夺宝奇兵
- UIImageView加载网络图片,NSOperationQueue来异步加载图片
- 获取两个日期的时间差(天数、时、分、秒)
- 11个cocos2d-x2.2.3经典游戏源代码
- js去掉html标签和去掉字符串文本的所有的空格
- OpenGL学习之统计图形
- win7(64位)平台下Cygwin+Eclipse搭建Hadoop单机开发环境 (二) Hadoop的安装
- Enable PO approval process to send PO in PDF format via email