iOS-UIImageView加载网络下载的图片(异步+多线程)
来源:互联网 发布:淘宝定价 编辑:程序博客网 时间:2024/04/30 02:35
最原始的加载网络下载的图片方式:
//最原始加载网络图片方法,相当阻塞主线程,界面卡顿-(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;}
0 0
- iOS-UIImageView加载网络下载的图片(异步+多线程)
- UIImageView异步加载网络图片
- UIImageView异步加载网络图片
- UIImageView异步加载网络图片
- IOS 图片异步加载 - UIImageView(AFNetworking)
- uiimageview 异步加载图片
- android异步的网络图片加载,支持多线程异步加载
- UIImageView加载网络图片,NSOperationQueue来异步加载图片
- UIImageView加载网络图片,NSOperationQuene异步加载图片
- ios异步下载加载图片
- iOS异步加载网络图片
- iOS异步加载网络图片
- ios-异步下载网络图片
- iOS UIImage 异步加载 图片缓存压缩 UIImageVIew分类
- [iOS]异步加载UIImageView----AsyImageView
- iOS UIImageView 网络加载图片自适应大小问题
- 使用 GCD 自定义 UIImageView 增加异步下载图片的类别
- iOS图片的异步加载
- 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文教程(精)
- MFC 中初始化RichEidt控件
- 采用ODAC,ODBC连接Oracle
- 《超实用的Node.js代码段》连载一:获取Buffer对象字节长度
- Jenkins入门总结
- iOS-UIImageView加载网络下载的图片(异步+多线程)
- 爬虫训练营-反爬虫之cookie
- cocos2d-x配置Android.mk遍历文件
- POJ-3414-Pots
- 基于modern ui for wpf的在线公开课平台 之三 使用grid布局
- 【2016年Esri开发者大会亮点解析】移动地图包首秀,支持打包矢量切片
- Google推荐的图片加载库Glide介绍
- is not a function
- Linux并发(task_struct结构体)