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

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] 666666666666
2016-04-27 15:47:54.526 多线程二[3177:369519] {number = 2, name = (null)}  invocation
2016-04-27 15:47:54.527 多线程二[3177:369520] 22222222222
2016-04-27 15:47:54.527 多线程二[3177:369524] 111111111111
2016-04-27 15:47:54.527 多线程二[3177:369527] 444444444444
2016-04-27 15:47:54.527 多线程二[3177:369520] 33333333333
2016-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] {number = 1, name = main}  i------htwj43oir
2016-04-27 15:45:45.373 多线程二[3119:366967] {number = 5, name = (null)}  ioierje-------+++++wr5htwj43oir
2016-04-27 15:45:45.373 多线程二[3119:366960] {number = 2, name = (null)}  fgggfhg---------
2016-04-27 15:45:45.373 多线程二[3119:366961] {number = 4, name = (null)}  blockOperation
2016-04-27 15:45:45.373 多线程二[3119:366964] {number = 3, name = (null)}  ioierjewr5htwj43oir




你可能感兴趣的:(iOS,iOS开发--实现功能)