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能够起到非常大的作用.主要有例 ...
随机推荐
- Blender Python UV 学习
Blender Python UV 学习 1. bmesh面转换 bm = bmesh.from_edit_mesh(bpy.context.edit_object.data) bm.faces.en ...
- VS中的路径宏
说明$(RemoteMachine)设置为“调试”属性页上“远程计算机”属性的值.有关更多信息,请参见更改用于 C/C++ 调试配置的项目设置.$(References)以分号分隔的引用列表被添加到项 ...
- 【读书笔记】UEFI原理与编程(1)概述及开发环境的搭建
一.概述: 0.为什么会有这篇文章 说实在的,在2016初的时候,我就萌生了写一个操作系统的念头,但是这对于我一个菜鸟来说,犹如登天. 既然想了就去写,即使最后做不完,也不后悔. 抱着这样的念头,我开 ...
- [hihocoder][Offer收割]编程练习赛43
版本号排序 不知道什么傻逼原因,就是过不了 #pragma comment(linker, "/STACK:102400000,102400000") #include<st ...
- dotnetnuke7.3.3 下弹出对话框(dnnConfirm())的使用
今天用dnn做一个列表里边有一个删除操作,就想做个对话框确定是否删除? 正常理解马上想到js的confirm("")函数,但是发现Dnn把这个函数给重写啦,弹出的对话框竟然是英文的 ...
- VS2012 编译 boost1.53/ boost1.49
原文链接:http://blog.csdn.net/ly131420/article/details/8904122 一.下载Boost库 boost_1_53_0.zip (http://www ...
- js 目录树
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- JS 猴子
公园里有一只猴子和一堆桃子,猴子每天吃掉桃子总数的一半,把剩下一半中扔掉一个坏的. 到第七天的时候,猴子睁开眼发现只剩下一个桃子.问公园里刚开始有多少个桃子? <!DOCTYPE html> ...
- 版本控制之git学习
最近学习了一下版本控制中比较符合开发者气质的Git,这里做一个总结.一来梳理所学的内容:二来也作为起点后续继续丰富.学习的方式主要为网络学习和个人实践.推荐两个学习网页,互相参考必有所成. 博客园:h ...
- 使用dom4j生成word的方法
http://blog.csdn.net/zhyh1986/article/details/8727523#t6 http://blog.csdn.net/zuozuofuwaiwai/article ...