NSOperation相关

1.Nsopreation的作用:

配合nsopreation和nsopreationqueue也能实现多线程编程

2.实现多线程的步骤:

1.将需要执行的操作,封装到nsopreation对象中

2.然后将nsopreation对象添加到nsopreationqueue中

3.系统会自动取出nsopreation和nsopreationqueue

4.将取出的nsopreation封装的操作放到一条新线程中执行。

3.Nsopreation的子类:

Nsopreation是个抽象类,并不具备封装操作的能力,必须使用他的子类

4.使用nsopreation子类的方法有三种:

NSInvocationOperation

NSBlockOperation

自定义nsoperation


NSOperation相关_第1张图片
1.NSInvocationOperation

NSBlockOperation:

NSOperation相关_第2张图片
2.NSBlockOperation

5.NSOperation:

主队列:[NSOperation MainQueue]和gcd中的主队列是一样的,是串行队列。

非主队列:[NSOperation alloc]init];非主队列同时具备并发和串行的功能。

默认情况下,非主队列是并发队列。

//将操作放到队列中,实现多线程


NSOperation相关_第3张图片
3.NSInvocationOperation实现多线程


NSOperation相关_第4张图片
4.NSBlockOperation实现多线程

6.自定义NSOperation

创建一个类,继承nsthread,然后在这个类的.m文件中重写main方法,告知要执行的任务代码。

自定义的好处:1.有利于代码的隐藏2.有利于代码的复用

NSOperation相关_第5张图片
5.

6.NSOperation的其他方法

1.设置最大并发数maxConcurrentOperationCount

2.根据这个属性,可以控制是并行队列还是串行队列。

3.如果一个队列事并发队列,开启了子线程。同一时间有多个操作在执行。最大并发数:指的是同一时间最多有多少个任务在执行,控制同一时间任务执行的任务数量。默认不受控制/设置为0,不能执行任务。如果设置为1,则是串行任务

4.串行执行任务不等于只开一条线程

5.如果maxConcurrentOperationCount >1,并发队列

maxConcurrentOperationCount=1串行队列

maxConcurrentOperationCount =0任务不会执行

maxConcurrentOperationCount =-1,特殊意义:表示最大值。表示队列的最大并发数不受限制。

NSOperation相关_第6张图片
NSOperation相关_第7张图片

对于自定义nsopreation,系统的canlcle等方法都不管用。建议在重写main方法的时候添加:

NSOperation相关_第8张图片

7.nsopreation 实现依赖和监听。

1.操作依赖:

NSOperation相关_第9张图片
依赖


2.操作监听

NSOperation相关_第10张图片
监听

8.nsopreation实现线程见的通信

NSOperation相关_第11张图片
线程通信

9.案例,用nsopreation的方法实现两张图片下载完成后合成一张图片。(考虑用依赖关系。合成图片的线程操作要依赖于两个下载图片的操作)附上代码

//案例2。下载两张图片。下载完以后合并图片。用nsopreation实现..可以用依赖关系实现

-(void)downloadsimages{

//1.创建队列

NSOperationQueue*queue = [[NSOperationQueuealloc]init];

__blockUIImage*image1;

__blockUIImage*image2;

//2封装操作,下载图片1

NSBlockOperation*download1 = [NSBlockOperationblockOperationWithBlock:^{

NSURL*url = [NSURLURLWithString:@"http://s15.sinaimg.cn/bmiddle/4c0b78455061c1b7f1d0e"];

NSData*imageData = [NSDatadataWithContentsOfURL:url];

image1 = [UIImageimageWithData:imageData];

NSLog(@"download---%@",[NSThreadcurrentThread]);

}];

//3封装操作,下载图片2

NSBlockOperation*download2 = [NSBlockOperationblockOperationWithBlock:^{

NSURL*url = [NSURLURLWithString:@"http://www.027art.com/feizhuliu/UploadFiles_6650/201109/2011091718442835.jpg"];

NSData*imageData = [NSDatadataWithContentsOfURL:url];

image2 = [UIImageimageWithData:imageData];

NSLog(@"download---%@",[NSThreadcurrentThread]);

}];//4.封装合并图片的操作

NSBlockOperation*combie = [NSBlockOperationblockOperationWithBlock:^{

//4.1开上下文

UIGraphicsBeginImageContext(CGSizeMake(200,200));

//4.2画图1

[image1drawInRect:CGRectMake(0,0,100,200)];

//4.3画图2

[image2drawInRect:CGRectMake(100,0,100,200)];

//4.4根据上下文得到图片

UIImage*image =UIGraphicsGetImageFromCurrentImageContext();

//4.5关闭上下文

UIGraphicsEndImageContext();

//7.更新UI

[[NSOperationQueuemainQueue]addOperationWithBlock:^{

self.imageVieww.image= image;

NSLog(@"UI----%@",[NSThreadcurrentThread]);

}];

}];

//5.设置依赖合成图片的操作需要依赖download 1,2

[combieaddDependency:download1];

[combieaddDependency:download2];

//6.添加操作到队列中

[queueaddOperation:download1];

[queueaddOperation:download2];

[queueaddOperation:combie];

}

你可能感兴趣的:(NSOperation相关)