多线程--- NSOperation

NSOperation 是iOS多线程其中一种常用形式, 它的执行步骤:

程序员:1、先将需要执行的一个操作封装到一个NSOperation对象中。

               2 、然后将NSOperation 对象添加到NSOperationQueue中。

系统 :  3、系统会自动将NSOperationQueue 中的NSOperation取出来。

              4、 将取出来的NSOperation封装的操作放到一条新的线程中执行。

NSInvocationOperation:

    // NSOperation为抽象类,不能直接使用。 --- 事务 () + queue = 把事务添加到队列 ---> 然后去执行
    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(opTest) object:nil];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    // 由系统调控
    [queue addOperation:op];
    // 手动吊起
    //[op start];

注意: 要么将任务添加队列, 让系统操控,  要么手动调起,不能同时调用。

block 写法:NSBlockOperation

   +(id)blockOperationWithBlock:(void(^)(void))block;

  • 创建NSBlockOperation对象

   -(void)addExecutionBlock:(void(^)(void))block;

  • 通过addExecutionBlock:方法添加更多的操作

代码如下

    // 操作优先级
    NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
       
        NSLog(@"NSThread ==111111 %@",[NSThread currentThread]);
        // 并发
        [NSThread sleepForTimeInterval:1];
        NSLog(@"123");
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            NSLog(@"更新UI");
        }];
    }];
    // CPU 调度的评率高
//    op.qualityOfService =
    [op addExecutionBlock:^{
        NSLog(@"456");
    }];
    op.completionBlock = ^{
        NSLog(@"完成");
    };
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    // 由系统调控
    [queue addOperation:op];

OperationQueue 的操作

maxConcurrentOperationCount : 最大并发操作数

addOperationWithBlock:balck    添加执行任务, 可以添加多个

        
    self.queue = [[NSOperationQueue alloc] init];
    self.queue.name = @"com.cooci.cn";
    self.queue.maxConcurrentOperationCount = 2;
    [self.queue addOperationWithBlock:^{
        for (int i = 0; i<1000; i++) {
            [NSThread sleepForTimeInterval:1];
            NSLog(@"%@1111111111--%d",[NSThread currentThread],i);
        }
    }];
    [self.queue addOperationWithBlock:^{
        for (int i = 0; i<1000; i++) {
            [NSThread sleepForTimeInterval:1];
            NSLog(@"%@222222222--%d",[NSThread currentThread],i);
        }
    }];

  挂起/继续  操作

    if (self.queue.operationCount == 0) {
        NSLog(@"没有操作执行");
        return;
    }
    if (self.queue.suspended) {
        NSLog(@"当前挂起来了");
    }else{
        NSLog(@"执行....");
    }
    self.queue.suspended = !self.queue.isSuspended;

     取消全部任务

[self.queue cancelAllOperations];

依赖 addDependency

       1. 假设三个任务  NSBlockOperation1  、  NSBlockOperation2、NSBlockOperation3

       2. 设置三个依赖,2的输入是1的结果,3的输入是2的结果。

            [2 addDependency:1];

            [3 addDependency:2];

            [self.queue addOperations:@[1,2,3] waitUntilFinished:NO];

           关于 waitUntilFinished,一般设置为NO, 这样不堵塞后边的执行。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值