iOS多线程-NSOperation

NSOperation其实就是苹果对GCD的封装,把GCD封装成面向对象的编程,让开发者使用起来更加方便,简洁。

NSOperation的核心

  • NSOperation操作
    • 不能直接使用。
    • 定义子类共有的属性和方法。
    • 子类:
      • NSInvocationOperation(Swift里面没有)
      • NSBlockOperation
  • NSOperationQueue队列
  • 将"操作" 添加到 "队列"类似于GCD将"任务"添加到 "队列"。
    • 队列:本质上 就是GCD的并发队列。
    • 操作:异步执行任务。
    //创建一个NSInvocationOperation
    NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(test:) object:@"invocation"];
    //创建队列
    NSOperationQueue * q = [[NSOperationQueue alloc]init];
    //将操作添加到队列 - 会自动异步执行调度方法
    [q addOperation:op];
    
    //创建NSBlockOperation对象
    NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
             NSLog(@"%@ --- %d",[NSThread currentThread],i);
         }];
    //创建队列
    NSOperationQueue * q = [[NSOperationQueue alloc]init];
    //添加到队列
    [q addOperation:op];
    

线程间的通讯(开发中常用写法)

[self.opQueue addOperationWithBlock:^{
     NSLog(@"耗时操作  %@",[NSThread currentThread]);
     //主线程更新 UI
     [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            NSLog(@ %@",[NSThread currentThread]);
      }];     
 }];

最大并发数

//这个属性便能控制线程的最大并发数
self.opQueue.maxConcurrentOperationCount = 2;

队列的暂停和继续

  • suspended: 决定队列的暂停和继续
    //YES暂停NO继续
    self.opQueue.suspended = NO;
    
  • operationCount : 队列中的操作数
    self.opQueue.operationCount 
    

取消所有操作

  • 队列挂起的时候,不会清空内部的操作.只有在队列继续的时候才会清空。
  • 正在执行的操作也不会被取消。
    [self.opQueue cancelAllOperations];
    

依赖关系

例子:

//1.下载
NSBlockOperation * op1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载---%@",[NSThread currentThread]);
        [NSThread sleepForTimeInterval:.5];
}];
//2.解压
NSBlockOperation * op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"解压---%@",[NSThread currentThread]);
        [NSThread sleepForTimeInterval:1.0];
}];
//3.通知用户
NSBlockOperation * op3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"通知用户---%@",[NSThread currentThread]);
 }];  
//NSOperation 提供了依赖关系
//注意,不要指定循环依赖,队列就不工作了!!
 [op2 addDependency:op1];
 [op3 addDependency:op2];
//添加到队列中 waitUntilFinished:是否等待! //会卡住当前线程!
[self.opQueue addOperations:@[op1,op2,op3] waitUntilFinished:NO];

添加好依赖条件操作就会等待依赖的操作执行完再执行。

你可能感兴趣的:(iOS多线程-NSOperation)