多线程-NSOperation

NSOperation是对GCD的封装,面向对象,比gcd更易于使用
优点:可添加完成的代码块,添加操作之间的依赖,方便控制之下顺序,可以设定优先级,可使用kvo观察操作执行状态。NSOperation是一个抽象类,不能直接使用,有2个抽象类NSInvocationOperation,NSBlockOperation

NSOperatiaon引进了操作(任务)和操作队列(队列)的概念

2.常用方法

1.创建队列
       //主队列
     NSOperationQueue *queue = [NSOperationQueue mainQueue];
     //其他队列
     NSOpreationQueue *OtherQueue = [NSOperationQueue alloc]init];


2、添加任务到队列里

[queue addOperation:blockOperation];

 【OtherQueue addOperations:(NSArray*):waitUntilfinished:(BOOL)】是否组塞当前线程直到所有操作结束

3、让队列里面,所有的Operation都取消

[queue cancelAllOperations];

4、获取当前线程对列

[NSOperationQueue currentQueue]

5、获取主线程对列

[NSOperationQueue mainQueue]

6、添加任务间的依赖关系,前者依赖于后者的完成,也就是后者执行完,前者才能执行,依赖关系需要放在添加到队列之前设置
 [invocation addDependency:blockOperation];
 
 removeDependency:op 删除依赖
  dependencies:返回依赖组


 7.优先级
     quequePriority:设置队列中任务的优先级,枚举
     NSOperationQueuePriorityVeryLow = -8L,
     NSOperationQueuePriorityLow = -4L,
     NSOperationQueuePriorityNormal = 0,
     NSOperationQueuePriorityHigh = 4,
     NSOperationQueuePriorityVeryHigh = 8

8. maxConcurrentOperationCount:(最大操作并发数)意思是一个队列中能同时进行多少个不同类型的任务。而不是开启多少条线程,注意:需要在任务加入队列提前设置
     比如:由2个任务a,b,每一个任务有各自追加了2个子任务 6个操作任务 当我们默认为-1时是同时执行不同类型的任务,同时执行2种任务也就是并行执行了2*2+2个的任务,线程的条数不确定由系统分配。
 当我们设置为1时,那么同时能执行一种类型的任务,并行执行了3个任务
 

3.NSOperation实现多线程步骤
1.创建操作
2.创建操作队列
3.将操作添加到队列中

4.NSInvocationOperation使用

主队列中不会开启新线程
  NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
  开启操作
 [op start];

5.NSBlockOperation使用

1.不追加操作的话

如果不追加操作的话是不会开启新线程。会在当前线程中执行,如果追加操作的话会开启新的线程,并且blokop也会在其他线程中执行,开启的线程由系统决定
 NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
        [self test];
    }];
[blockOp start];

2.追加操作的话

 NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
        [self test];
    }];
 
    
    //addexecutionBlock 添加新的操作,运行顺序不确定 增加新的线程
    [blockOp addExecutionBlock:^{
      
        
        for (NSInteger i=0; i<5;i++ ) {
            
            [NSThread sleepForTimeInterval:2];
            
            NSLog(@"NSBlock新的操作1----- %@",[NSThread currentThread]);
        }
        
    }];
    [blockOp addExecutionBlock:^{
        
        
        for (NSInteger i=0; i<5;i++ ) {
            
            [NSThread sleepForTimeInterval:2];
            
            NSLog(@"NSBlock新的操作2----- %@",[NSThread currentThread]);
        }
        
    }];
    
 [blockOp start];

总结:NSBlockOperation追加操作的话会开启线程,但是顺序不确定

3.NSBlockOperation添加依赖实现按顺序执行

  NSBlockOperation *blockop1 = [NSBlockOperation blockOperationWithBlock:^{
        for (NSInteger i=0; i<5;i++ ) {
            
            [NSThread sleepForTimeInterval:2];
            
            NSLog(@"block1---0操作 %@",[NSThread currentThread]);
        }
    }];
    
    [blockop1 addExecutionBlock:^{
        for (NSInteger i=0; i<4;i++ ) {
            
            [NSThread sleepForTimeInterval:2];
            
            NSLog(@"block1-----1操作 %@",[NSThread currentThread]);
        }
    }];


     [blockop1 addExecutionBlock:^{
    for (NSInteger i=0; i<3;i++ ) {
        
        [NSThread sleepForTimeInterval:2];
        
        NSLog(@"block1add-----2操作 %@",[NSThread currentThread]);
    }
}];

NSBlockOperation *blockop2 = [NSBlockOperation blockOperationWithBlock:^{
        for (NSInteger i=0; i<7;i++ ) {
            
            [NSThread sleepForTimeInterval:2];
            
            NSLog(@"block2----总操作 %@",[NSThread currentThread]);
        }
    }];
    
    
    [blockop2 addExecutionBlock:^{
        for (NSInteger i=0; i<6;i++ ) {
            
            [NSThread sleepForTimeInterval:2];
            
            NSLog(@"block2add-----1操作 %@",[NSThread currentThread]);
        }
    }];


    //添加依赖:按顺序执行
 [blockop2 addDependency:blockop1];
 [blockop3 addDependency:blockop2];
 
  //自定义队列
   NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    queue.maxConcurrentOperationCount = 1;
   [queue addOperations:@[blockop1,blockop2] waitUntilFinished:NO];

4线程间通信

//     //线程间通信
   [queue addOperationWithBlock:^{


        //主队列
        [[NSOperationQueue mainQueue]addOperationWithBlock:^{
            //添加任务
        }];

    }];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值