网络多线程 ---实现网络加载图片

案例要求:网络加载图片,随机加载到设置好的视图上

实现的效果图如下:

具体代码如下:

//

//  ViewController.m

//  0603---NSOperationQueue

#import "ViewController.h"

@interface
ViewController ()

@property (nonatomic,strong)
NSMutableArray * imageArray;

@end

@implementation ViewController

#pragma mark - 懒加载

- (NSMutableArray *)imageArray

{

if (_imageArray==nil)

{

_imageArray=[NSMutableArray
array];

}

return
_imageArray;

}

#pragma mark - 入口

- (void)viewDidLoad {

[super
viewDidLoad];

//加载视图

[self
_loadViews];

//开启多线程加载图片

[self
_loadThread];

}

- (void)_loadViews

{

for (int i=0; i<15; i++)

{

int col=i%3;

int row=i/3;

UIImageView * imageView=[[UIImageView
alloc]initWithFrame:CGRectMake(22+col*(80+45),
40+row*(100+20),
90, 90)];

imageView.backgroundColor=[UIColor
redColor];

[self.imageArray
addObject:imageView];

[self.view
addSubview:imageView];

}

}

- (void)_loadThread

{

//开启多线程

NSOperationQueue * queue=[[NSOperationQueue
alloc]init];

for(int i=0;i<self.imageArray.count;i++)

{

NSBlockOperation * block=[NSBlockOperation
blockOperationWithBlock:^{

//下载图片

NSString * imageSrc=@"http://images.cnblogs.com/cnblogs_com/kenshincui/613474/o_%d.jpg";

imageSrc=[NSString
stringWithFormat:imageSrc,i];
//拼接字符串

NSURL * URL = [NSURL
URLWithString:imageSrc];

NSData * data = [NSData
dataWithContentsOfURL:URL];

UIImage * image=[UIImage
imageWithData:data];

//获取主线程,刷新UI

NSOperationQueue * queue2=[NSOperationQueue
mainQueue];

[queue2
addOperationWithBlock:^{

//刷新图片,给imageView赋值

UIImageView * imageView=self.imageArray[i];

imageView.image=image;

}];

}];

[queue
addOperation:block];

}

}

@end

0602---小结:

多线程的三种创建方式

NSThread

1.实例方法:(调用start方法开启多线程)

[NSThread alloc]initWithTarget:nil selector:nil withObject:nil];

2.类方法

[NSThread detachNewThreadSelector:nil toTarget:nil withObject:nil];

3.刷新UI必须通过主线程

[self performSelectorOnMainThread:nil withObject:nil waitUntilDone:nil];

(*)4.隐式开启多线程

[self performSelectorInBackground:nil withObject:nil];

0603- - - -NSOperationQueue

1.有对象方法,没有类方法

创建多线程(4种方式):

// 1> 采用NSOperation的子类NSInvocationOperation来开启多线程(必须添加到队列)

NSInvocationOperation * nvo=[[NSInvocationOperation
alloc]initWithTarget:self
selector:@selector(show)
object:nil];

[queue
addOperation:nvo];

// 2> 采用NSBlockOperation
来开启多线程(必须添加到队列)

NSBlockOperation * block=[NSBlockOperation
blockOperationWithBlock:^{

NSLog(@"我是block");

}];

[queue
addOperation:block];

// 3> 采用队列(不须重新添加到队列)

[queue addOperationWithBlock:^{

NSLog(@"我是queue创建的block");

}];

// 4>

NSBlockOperation * block=[NSBlockOperation
blockOperationWithBlock:^{

NSLog(@"NSBlockOperation");

}];

[block addExecutionBlock:^{

NSLog(@"NSBlockOperation===1");

}];

[block addExecutionBlock:^{

NSLog(@"NSBlockOperation===2");

}];

[block addExecutionBlock:^{

NSLog(@"NSBlockOperation===3");

}];

[block
start];

2.指定线程的执行顺序- - - 依赖(addDependency)

//创建block1

NSBlockOperation * block1=[NSBlockOperation blockOperationWithBlock:^{

NSLog(@"我是block1");

}];

[queue addOperation:block1];   //添加到队列

//创建block2

NSBlockOperation * block2=[NSBlockOperation blockOperationWithBlock:^{

NSLog(@"我是block2");

}];

[block2 addDependency:block1];   //依赖---先后执行顺序(block1 > block2)

[queue addOperation:block2];     //添加到队列

3.刷新UI

//开启多线程

NSOperationQueue * queue=[[NSOperationQueue
alloc]init];

NSBlockOperation * block=[NSBlockOperation
blockOperationWithBlock:^{

//下载图片

{

}

//获取主线程,刷新UI

NSOperationQueue * queue2=[NSOperationQueue
mainQueue];

[queue2 addOperationWithBlock:^{

//刷新图片,给imageView赋值

{

}

}];

}];

[queue
addOperation:block];

时间: 2024-08-27 07:54:24

网络多线程 ---实现网络加载图片的相关文章

iOS多线程自定义operation加载图片 不重复下载图片

摘要:1:ios通过抽象类NSOperation封装了gcd,让ios的多线程变得更为简单易用:   2:耗时的操作交给子线程来完成,主线程负责ui的处理,提示用户的体验   2:自定义operation继承自NSOperation,在子线程中下载图片: 3:保证图片只下载一次,还有保证下载任务不重复 ------------------------------------------------------------------------------------ 实现原理:1:图片缓存:用

iOS网络加载图片缓存与SDWebImage

加载网络图片可以说是网络应用中必备的.如果单纯的去下载图片,而不去做多线程.缓存等技术去优化,加载图片时的效果与用户体验就会很差. 一.自己实现加载图片的方法 tips: *iOS中所有网络访问都是异步的.(自己开线程去下载) *普通为模型增加UIImage属性的方法做的是内存缓存(下次启动还需要从网络重新加载), 而要做本地缓存的话,还要自己手动存储网络上下载的图片. *为了加快访问, 还需要自己去弄缓存.(内存缓存或者本地缓存) *当图片没有下载完成时,还要设置占位图片. 以下代码用NSOp

【iOS】网络加载图片缓存与SDWebImage

加载网络图片可以说是网络应用中必备的.如果单纯的去下载图片,而不去做多线程.缓存等技术去优化,加载图片时的效果与用户体验就会很差. 一.自己实现加载图片的方法 tips: *iOS中所有网络访问都是异步的.(自己开线程去下载) *普通为模型增加UIImage属性的方法做的是内存缓存(下次启动还需要从网络重新加载), 而要做本地缓存的话,还要自己手动存储网络上下载的图片. *为了加快访问, 还需要自己去弄缓存.(内存缓存或者本地缓存) *当图片没有下载完成时,还要设置占位图片. 以下代码用NSOp

android优化从网络中加载图片速度。。

从网络中加载图片主要要注意两个方面的问题: 1.内存管理:图片占的内存很大,假如图片数量多,很容易让系统抛出out of memory的异常. 同时我们也要注意不同android版本中内存管理的区别. 2.性能:图片的加载速度,和加载图片时不影响UI的流畅性 尤其是在ViewPager,GridView 和ListView等等需要在短时间内加载大量图片时,上面两个问题就更加突出了... 要解决上面这个两个问题,我们要用到的技术 1.缩减加载的图片的bitmap 可以通过实现显示图片的view的大

没有网络连接时程序崩溃问题以及动态加载图片问题已解决

经过进一步的研究我们把没有网络连接时程序崩溃的大bug修改掉了,如果是程序打开时没有网络连接会弹出网络连接失败的 对话框,如果在程序运行过程中出现网络异常,在需要连接服务器的时候会抛出网络连接异常: 第二个是动态加载图片问题的解决,我们通过查资料找到方法把bitmap加载进gradeview,用一个线程每次加载一个图片然后 把对应课程位置的图标替换掉,最后实现了动态刷新网络图片. 这两个问题修改过之后,我们的程序中基本的功能已经完善了,最后我们会对UI进行小的修改,让程序更加完美. 下面是新的安

三种基本网络加载图片方式

代码片段(6) [全屏查看所有代码] 1. [代码]普通加载网络方式     ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 public class NormalLoadPictrue {   

iOS网络加载图片缓存策略之ASIDownloadCache缓存优化

在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用户体验,为了不是每次显示都需要从网上下载数据,希望将图片放到本地缓存,因此我们需要一个好的的缓存策略,今天我将我在项目工程中的实际经验分享给大家,我这里主要介绍一下强大的ASIHTTPRequest的缓存策略,以及使用方法. AD: 在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用户体验,为了不

Android异步加载学习笔记之四:利用缓存优化网络加载图片及ListView加载优化

如果不做任何处理,直接用网络加载图片在网速快的情况下可能没什么不好的感觉,但是如果使用移动流量或是网络不好的时候,问题就来了,要么用户会抱怨流量使用太多,要么抱怨图片加载太慢,如论从哪个角度出发,都不是好的体验!要提高用户体验,我们就要使用缓存.Android中数据缓存的方式有很多,相关介绍的文章也比较多,比如http://blog.csdn.net/dahuaishu2010_/article/details/17093139和http://www.jb51.net/article/38162

iOS网络编程(三) 异步加载及缓存图片----&gt;SDWebImage

@SDWebImage提供一个UIImageView的类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. @SDWebImage的导入1.https://github.com/rs/SDWebImage 下载SDWebImage开源包2.将类包拖入工程,再导入MapKit.framework.ImageIO.framework两个框架3.SDWebImage是支持ARC的,在MRC的工程中要注意,可参考MRC工程配置ARC4.注意:SDWebImag