您的位置:首页 > 移动开发 > IOS开发

iOS开发--多线程编程(三)NSOperation

2016-04-27 15:45 477 查看
NSOperation是一个基类(抽象类)不能直接使用,必须使用他的子类它默认是在当前线程进行操作如果单独使用NSOperation必须手动启动常与 NSOperationQueue一起使用。在与NSOperationQueue一起使用会自动开辟线程进行操作不用手动启动NSOperation系统提供的两个子类NSInvocation ,NSBlockOperation1,NSInvocation单一使用 它是同步执行的2,NSBlockOperation(操作数>1,也会开辟线程去执行操作NSOperation类是用来封装与单个任务相关的代码和数据的抽象类,因为它是抽象的,你不能直接使用这个类下面是使用案例:1,使用 NSInvocation:
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

//    不能直接使用 operation 是因为 它里面 没有可以直接操作的方法,只是一个基类
NSInvocationOperation *invocation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act:) object:@"invocation"];
invocation.name = @"invocation";
//    如果单独使用 NSInvocationOperation 的话,必须手动启动
//    [invocation start];

//    不能直接使用 operation 是因为 它里面 没有可以直接操作的方法,只是一个基类
NSInvocationOperation *invocation11 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act1:) object:@"invocation11"];
invocation11.name = @"invocation11";
//    如果单独使用 NSInvocationOperation 的话,必须手动启动
//    NSOperationQueue 不需要手动启动
//    [invocation11 start];

//    operation 默认是在当前线程 去执行 (同步执行)

NSInvocationOperation *invocation12 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act2:) object:@"invocation12"];
invocation12.name = @"invocation12";
NSInvocationOperation *invocation13 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act3:) object:@"invocation13"];
invocation13.name = @"invocation13";
NSInvocationOperation *invocation14 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act4:) object:@"invocation14"];
invocation14.name = @"invocation14";
NSInvocationOperation *invocation15 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act5:) object:@"invocation15"];
invocation15.name = @"invocation15";
NSInvocationOperation *invocation16 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act6:) object:@"invocation16"];
invocation16.name = @"invocation16";
//    可以使用线程队列去 NSOperationQueue 管理线程 (默认会开辟线程去执行)
//    不用手动启动线程
//    异步执行
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//    可以设置线程队列的最大并发数(最多可以允许几个操作 同时执行),线程池中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样会同时运行队列中的全部的操作。
queue.maxConcurrentOperationCount = 2;
[queue addOperation:invocation];
[queue addOperation:invocation16];
[queue addOperation:invocation11];
[queue addOperation:invocation12];
[queue addOperation:invocation14];
[queue addOperation:invocation13];
[queue addOperation:invocation15];
}

- (void)act:(id)sender{
NSLog(@"%@  %@",[NSThread currentThread],sender);
}

- (void)act1:(id)sender{
NSLog(@"111111111111");
}

- (void)act2:(id)sender{
NSLog(@"22222222222");
}

- (void)act3:(id)sender{
NSLog(@"33333333333");
}

- (void)act4:(id)sender{
NSLog(@"444444444444");
}

- (void)act5:(id)sender{
NSLog(@"55555555555");
}

- (void)act6:(id)sender{
NSLog(@"666666666666");
}
输出结果: 可见输出与方法的调用顺序是不一样的,因为是异步
2016-04-27 15:47:54.526 多线程二[3177:369520] 6666666666662016-04-27 15:47:54.526 多线程二[3177:369519] <NSThread: 0x7fd452b0b250>{number = 2, name = (null)}  invocation2016-04-27 15:47:54.527 多线程二[3177:369520] 222222222222016-04-27 15:47:54.527 多线程二[3177:369524] 1111111111112016-04-27 15:47:54.527 多线程二[3177:369527] 4444444444442016-04-27 15:47:54.527 多线程二[3177:369520] 333333333332016-04-27 15:47:54.527 多线程二[3177:369524] 55555555555
2,使用 NSBlockOperation
 同样是异步操作
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{//        具体执行的方法[self act:@"blockOperation"];}];//    添加操作//    当 NSBlockOperation 的操作数大于1的时候  会开辟线程执行[blockOperation addExecutionBlock:^{[self act:@"fgggfhg---------"];}];[blockOperation addExecutionBlock:^{[self act:@"ioierjewr5htwj43oir"];}];[blockOperation addExecutionBlock:^{[self act:@"i------htwj43oir"];}];[blockOperation addExecutionBlock:^{[self act:@"ioierje-------+++++wr5htwj43oir"];}];[blockOperation start];
输出结果:同样是异步,所以顺序不一致
2016-04-27 15:45:45.373 多线程二[3119:366879] <NSThread: 0x7fe709604fc0>{number = 1, name = main}  i------htwj43oir2016-04-27 15:45:45.373 多线程二[3119:366967] <NSThread: 0x7fe70b200430>{number = 5, name = (null)}  ioierje-------+++++wr5htwj43oir2016-04-27 15:45:45.373 多线程二[3119:366960] <NSThread: 0x7fe70b1a14c0>{number = 2, name = (null)}  fgggfhg---------2016-04-27 15:45:45.373 多线程二[3119:366961] <NSThread: 0x7fe709507000>{number = 4, name = (null)}  blockOperation2016-04-27 15:45:45.373 多线程二[3119:366964] <NSThread: 0x7fe709400280>{number = 3, name = (null)}  ioierjewr5htwj43oir
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: