Objective-C-NSOperation

NSOpseration是抽象基类,所以要用子类实现它的方法。(内部使用gcd实现)
1.一个NSOperation 就代表一个任务,任务的代码分装在block里或者函数里。
    OC提供子类:
        NSInvocztionOperation:任务是一个函数,比较长
        NSBlockOperation:任务是一个block,比较短

常用方法demo:(有关线程执行方式,队列类型看这里

1.1NSBlockOperation:

- (void) testBlockOperation2
{
    //情况1.
    NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"startA:%@", [NSThread currentThread]);
    }];
    [operationA start];
    NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"startB:%@", [NSThread currentThread]);
    }];
    [operationB start];
    NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"startC:%@", [NSThread currentThread]);
    }];
    [operationC start];
    
    //情况2.
    NSBlockOperation *operation = [[ NSBlockOperation alloc] init];
    [operation addExecutionBlock:^{
        NSLog(@"start1:%@", [NSThread currentThread]);
    }];
    
    [operation addExecutionBlock:^{
        NSLog(@"start2:%@", [NSThread currentThread]);
    }];
    [operation addExecutionBlock:^{
        NSLog(@"start3:%@", [NSThread currentThread]);
    }];
    [operation start];
}

135352_Yyzi_2391617.png

可以看到任务配置好以后,直接执行时同步的。而把任务block放到一起的时候是异步的。

- (void) testBlockOperation
{
    //情况3.
    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"start1:%@", [NSThread currentThread]);
    }];
    
    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"start2:%@", [NSThread currentThread]);
    }];
    
    NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"start3:%@", [NSThread currentThread]);
    }];
    
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperations:@[operation3, operation2, operation1] waitUntilFinished:NO];
}

135849_oIx8_2391617.png

放到全局队列里也是异步的(并发),如果放到主队列([NSOperationQueue mainQueue])里,那么是同步的。


1.2NSInvocztionOperation:使用它和NSBlockOperation是一样的。都是NSOperation的子类……

- (void) testOperationInvocation{
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationFirst:) object:@"start"];
    [operation1 start];
    
    NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationFirst:) object:@"newQ"];
    [queue addOperation:operation2];
}

- (void) operationFirst:(NSString *) who
{
    NSLog(@"\n%@, %s, %@", who, __func__, [NSThread currentThread]);
}


2.任务间依赖关系:也是用来实现异步线程间通信的一种约定

- (void) operationDependency
{
    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"thread 1");
    }];
    [operation1 setCompletionBlock:^{
        NSLog(@"finish thread1");
    }];
    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"thread 2");
    }];
    NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"thread 3");
    }];
    
    [operation1 addDependency:operation2];
    [operation2 addDependency:operation3];
    
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];
}

140757_OCUA_2391617.png依据依赖顺序执行




转载于:https://my.oschina.net/changzhongwei/blog/630293

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值