1.Nsopreation的作用:
配合nsopreation和nsopreationqueue也能实现多线程编程
2.实现多线程的步骤:
1.将需要执行的操作,封装到nsopreation对象中
2.然后将nsopreation对象添加到nsopreationqueue中
3.系统会自动取出nsopreation和nsopreationqueue
4.将取出的nsopreation封装的操作放到一条新线程中执行。
3.Nsopreation的子类:
Nsopreation是个抽象类,并不具备封装操作的能力,必须使用他的子类
4.使用nsopreation子类的方法有三种:
1.NSInvocationOperationNSInvocationOperation
NSBlockOperation
自定义nsoperation
NSBlockOperation:
2.NSBlockOperation5.NSOperation:
3.NSInvocationOperation实现多线程 4.NSBlockOperation实现多线程主队列:[NSOperation MainQueue]和gcd中的主队列是一样的,是串行队列。
非主队列:[NSOperation alloc]init];非主队列同时具备并发和串行的功能。
默认情况下,非主队列是并发队列。
//将操作放到队列中,实现多线程
6.自定义NSOperation
创建一个类,继承nsthread,然后在这个类的.m文件中重写main方法,告知要执行的任务代码。
自定义的好处:1.有利于代码的隐藏2.有利于代码的复用
5.
6.NSOperation的其他方法
1.设置最大并发数maxConcurrentOperationCount
2.根据这个属性,可以控制是并行队列还是串行队列。
3.如果一个队列事并发队列,开启了子线程。同一时间有多个操作在执行。最大并发数:指的是同一时间最多有多少个任务在执行,控制同一时间任务执行的任务数量。默认不受控制/设置为0,不能执行任务。如果设置为1,则是串行任务
4.串行执行任务不等于只开一条线程
5.如果maxConcurrentOperationCount >1,并发队列
maxConcurrentOperationCount=1串行队列
maxConcurrentOperationCount =0任务不会执行
maxConcurrentOperationCount =-1,特殊意义:表示最大值。表示队列的最大并发数不受限制。
对于自定义nsopreation,系统的canlcle等方法都不管用。建议在重写main方法的时候添加:
7.nsopreation 实现依赖和监听。
1.操作依赖:
依赖2.操作监听
监听8.nsopreation实现线程见的通信
线程通信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];
}
网友评论