iOS-UIImageView加载网络下载的图片(异步+多线程)
2016-03-14 11:30
639 查看
最原始的加载网络下载的图片方式:
使用异步线程加载图片,在加载完成后设置图片,可以在网络加载完成之前,UIimageview先使用占位图片。
如果考虑到线程安全,需要开启自动释放池,此方法同上:
//最原始加载网络图片方法,相当阻塞主线程,界面卡顿 -(void)setImageWithURL:(NSString *)imageDownloadUrl{ UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(44, 64, 250, 250)]; NSURL *URL = [NSURL URLWithString:imageDownloadUrl]; NSError *ERROR; NSData *imageData = [NSData dataWithContentsOfURL:URL options:NSDataReadingMappedIfSafe error:&ERROR]; UIImage *image = [UIImage imageWithData:imageData]; [imageView setImage:image]; }
使用异步线程加载图片,在加载完成后设置图片,可以在网络加载完成之前,UIimageview先使用占位图片。
//异步线程加载网络下载图片 ——> 回到主线程更新UI -(void)downloadImageWithUrl:(NSString *)imageDownloadURLStr{ //以便在block中使用 __block UIImage *image = [[UIImage alloc] init]; //图片下载链接 NSURL *imageDownloadURL = [NSURL URLWithString:imageDownloadURLStr]; //将图片下载在异步线程进行 //创建异步线程执行队列 dispatch_queue_t asynchronousQueue = dispatch_queue_create("imageDownloadQueue", NULL); //创建异步线程 dispatch_async(asynchronousQueue, ^{ //网络下载图片 NSData格式 NSError *error; NSData *imageData = [NSData dataWithContentsOfURL:imageDownloadURL options:NSDataReadingMappedIfSafe error:&error]; if (imageData) { image = [UIImage imageWithData:imageData]; } //回到主线程更新UI dispatch_async(dispatch_get_main_queue(), ^{ [_imageView setImage:image]; }); }); }
如果考虑到线程安全,需要开启自动释放池,此方法同上:
#pragma mark - 下载图片-子线程调用 -(void)downloadImage{ /** 子线程里面的runloop默认不开启,也就意味着不会自动创建自动释放池,子线程里面autorelease的对象 就会没有池子释放。也就一位置偶棉没有办法进行释放造成内存泄露 所以需要手动创建 */ @autoreleasepool { NSLog(@"%@",[NSThread currentThread]); NSURL *url = [NSURL URLWithString:@"http://baidu.com/image/Users/qiuxuewei/Desktop/qiu.JPG"]; NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image0 = [UIImage imageWithData:data]; UIImage *image = [UIImage imageNamed:@"qiu.JPG"]; //UI要求在主线程中进行 //self.imageView.image = image; //1、 [self performSelectorOnMainThread:@selector(updataImage:) withObject:image waitUntilDone:NO]; //2、 [self performSelector:@selector(updataImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES]; [self.imageView performSelectorOnMainThread:@selector(updataImage:) withObject:image waitUntilDone:YES]; //waitUntilDone: 表示是否等待子线程方法执行完毕 //如果是YES:那就等子线程方法执行完再执行当前函数 NSLog(@"完成.."); } } -(void)updataImage:(UIImage *)image{ self.imageView.image = image; }
相关文章推荐
- 当你在浏览器输入一个网址,如http://www.taobao.com,按回车之后发生了什么?
- tcp/ip 协议 正解
- TCP/IP详解学习笔记(1)-基本概念
- 解决App Transport Security has blocked a cleartext HTTP (http://) resource load
- android studio http请求导入jar包冲突
- android studio插件快速开发之gson解析网络数据
- ceph 自动化自动化安装
- SQL Server 之 在与SQLServer建立连接时出现与网络相关的或特定于实例的错误
- Neural Networks and Deep Learning 神经网络和深度学习book
- swift 网络请求
- TCP三次握手
- Windows最常用的几个网络CMD命令总结
- http与https
- 网络故障:本地连接受到限制或者是有个黄色的叹号,默认网关是0.0.0.0
- TCP并发服务器模型(一)
- Android HTTP通信基础
- 网络请求时对于服务器返回NSNull对象的处理
- Python安装httplib2 0.9.2
- Android网络请求心路历程
- log_format directive may be used only on http level