ios多线程操作(十一)—— NSOperation的高级操作

13 篇文章 0 订阅
NSOperation可以调用start方法来执行任务,但默认是同步执行的,如果将NSOperation添加到      NSOperationQueue(操作队列)中,系统会自动异步执行队列中的操作。
      NSOperationQueue中可以对操作进行取消,暂停和恢复
      取消函数为:  
- (void)cancelAllOperations;
    也可以调用NSOperation的cancel方法来取消单个操作  
- (void)cancel;
  队列中有个属性 suspended ,通过设置该BOOL值的YES或NO来暂停和恢复操作。
  操作也有优先级,通过设置NSOperation在队列中的优先级,可以改变操作的执行优先级,NSOperation中有个属性queuePriority,
可以通过该属性来设置,优先级的取值都有
    NSOperationQueuePriorityVeryLow = -8L,
          NSOperationQueuePriorityLow = -4L,
          NSOperationQueuePriorityNormal = 0,
          NSOperationQueuePriorityHigh = 4,
          NSOperationQueuePriorityVeryHigh = 8
     NSOperation中具备一个非常常用的属性,该属性在头文件中得定义如下
@property (copy) void (^completionBlock)(void) NS_AVAILABLE(10_6, 4_0);

通过该属性我们可以进行操作的监听,当该操作执行完毕后,就会执行completionBlock中的块代码,例如:
// 新建一个块操作
    NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
        [NSThread sleepForTimeInterval:3.0];
        NSLog(@"%@ , come here",[NSThread currentThread]);
    }];
    // 新建一个操作队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    // 将操作添加到队列
    [queue addOperation:op];
    // 监听该操作,当完成该操作后执行的代码
    [op setCompletionBlock:^{
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            NSLog(@"%@,here",[NSThread currentThread]);
        }];

    }];

效果如下:


无论执行什么操作,块代码总会在最后执行!     
       NSoperation之间可以设置依赖来保证执行顺序,例如:
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"用户登录 %@", [NSThread currentThread]);
    }];
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"付费 %@", [NSThread currentThread]);
    }];
    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        [NSThread sleepForTimeInterval:1.0f];
        NSLog(@"下载 %@", [NSThread currentThread]);
    }];
    NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"更新UI %@", [NSThread currentThread]);
    }];
   
    /* "指定任务之间的依赖关系" - GCD使用的同步任务(不会开线程)
     NSOperation 会开线程,但是依然能够保证操作的执行顺序,并发效率会更好!
     依赖关系,是可以跨队列的 */
    
    // 付费之前需要登录
    [op2 addDependency:op1];
    // 下载之前需要付费
    [op3 addDependency:op2];
    // 更新UI之前需要完成下载
    [op4 addDependency:op3];
   
    // 注意:在指定依赖关系时,注意不要出现循环依赖
    // waitUntilFinished == NO,异步的 YES 是同步的
    [self.queue addOperations:@[op1, op2, op3] waitUntilFinished:NO];
    
    // 更新UI的操作,应该由主队列来调度
    [[NSOperationQueue mainQueue] addOperation:op4];
   
    NSLog(@"come here");


执行效果如下:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值