iOS-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;
}
iOS-UIImageView载入网络下载的图片(异步+多线程)的更多相关文章
- 【iOS开发-从网络上获取图片尺寸】
实际开发过程中,容易碰到从网络上获取图片尺寸的场景,比如一个UIImageView要装载从网络上获取的图片,但要先设置其frame,此时又不知道图片尺寸,就要从网络上获取尺寸了.为了最好的用户体验,一 ...
- Android 的图片异步请求加三级缓存 ACE
使用xUtils等框架是很方便,但今天要用代码实现bitmapUtils 的功能,很简单, 1 AsyncTask请求一张图片 ####AsyncTask #####AsyncTask是线程池+han ...
- ios 从网络上获取图片并在UIImageView中显示
ios 从网络上获取图片 -(UIImage *) getImageFromURL:(NSString *)fileURL { NSLog(@"执行图片下载函数"); UIIm ...
- iOS网络加载图片缓存策略之ASIDownloadCache缓存优化
iOS网络加载图片缓存策略之ASIDownloadCache缓存优化 在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用 ...
- iOS开发网络请求——大文件的多线程断点下载
iOS开发中网络请求技术已经是移动app必备技术,而网络中文件传输就是其中重点了.网络文件传输对移动客户端而言主要分为文件的上传和下载.作为开发者从技术角度会将文件分为小文件和大文件.小文件因为文件大 ...
- [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading
上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...
- iOS网络加载图片缓存与SDWebImage
加载网络图片可以说是网络应用中必备的.如果单纯的去下载图片,而不去做多线程.缓存等技术去优化,加载图片时的效果与用户体验就会很差. 一.自己实现加载图片的方法 tips: *iOS中所有网络访问都是异 ...
- 使用开源库 SDWebImage 异步下载缓存图片(持续更新)
source https://github.com/rs/SDWebImage APIdoc http://hackemist.com/SDWebImage/doc Asynchronous im ...
- ImageLoader实现图片异步载入
ImageLoader是一个广泛使用的图片库,在向网络请求图片时.使用imageView和smartView常会产生outofmemory错误,这时ImageLoader能够起到非常大的作用.主要有例 ...
随机推荐
- MSDN性能分析相关网站收集
Visual Studio 性能分析初学者指南 | Microsoft Docshttps://docs.microsoft.com/zh-cn/visualstudio/profiling/begi ...
- 【正则表达式】从json数组中抽取id列表
有如下数组,要从中取出id: "[\"3812662409\",\"3812633637\",\"3812627686\",\&q ...
- cropper+pillow处理上传图片剪裁(二)
上次说到处理上传头像的方法是临时保存在本地,其实这样做并不妥,而且修改后的头像重新上传到model中也很麻烦,差了很多资料,解决了这个问题 大致思路:用户上传原图和修改数据—PIL修改后将图片保存为内 ...
- H5 微信公众号 监听返回事件
/*-----监听返回事件-----*/ function pushHistory(returnUrl,currentUrl,currentTitle) { window.addEventListen ...
- QT4.8界面设计(MSVC2010X)
1.C++ IDE设计 MFC这种半死不活的windows C++平台已经被抛弃,很无奈.转向Qt的C++还是不错的选择. QT的QML才是最新的亮点,可惜没有时间经历这些东西了. 2.程序代码 2. ...
- CDR中是否有图层,如何调出图层面板?
什么是图层?如果有点PS基础的同学,应该会非常清楚这个概念,它是构成图像的重要组成单位,许多效果可以通过对层的直接操作而得到,并在当前图层操作时候不会影响到其他图层,所以在绘图的过程中有着很重要的作用 ...
- 洛谷P1441 砝码称重 枚举 + 01背包
显然,n<=20, m<=4 的数据范围一眼爆搜. 直接搜索一下不用哪4个砝码,再做一遍01背包即可. 可能是本人太菜鸡,01背包部分调了半天QAQ-- #include<cstdi ...
- 路飞学城Python-Day181
Evernote Export Nginx默认网站 当Nginx配置文件中有且仅有一个Server的时候,该Server就被Nginx认为是默认网站,所有发给Nginx服务器80端口的数据都会默认给s ...
- Centos7安装keepalived(自定义路径安装)-高级篇
0.Keepalived介绍 Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat.corosync.pacemaker.但 ...
- JavaScript对原始数据类型的拆装箱操作
JS中的基本类型: boolean null undefined string number symbol 每当读取一个基本类型的时候,会隐式的自动进行装箱操作(即:将一个基本类型变成对象): var ...