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

来源:互联网 发布:如何查看知乎提问者 编辑:程序博客网 时间:2024/04/30 08:24

NSOperation是一个基类(抽象类)不能直接使用,必须使用他的子类它默认是在当前线程进行操作如果单独使用 NSOperation必须手动启动

 常与 NSOperationQueue一起使用。在与 NSOperationQueue一起使用会自动开辟线程进行操作不用手动启动

 NSOperation系统提供的两个子类

 NSInvocation ,NSBlockOperation

 

1,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




0 0