NSOperation

NSOperation 是一个抽象基类,使用的话最多的是系统封装好的两个类

  • NSInvocationOperation
  • NSBlockOperation
    NSOperation必须配合NSOperationQueue使用,否则没毛用。在自定义队列中两者都是异步执行,且都在子线程执行。block内部同步执行。

基本用法

NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];  //主队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //自定义队列
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
                //任务执行
            }];
[queue addOperation:operation];
//可以设置maxConcurrentOperationCount 最大线程数,为1则成为一个串行队列

实例

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"----");
    //1.创建队列
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
    //2.封装操作
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        
        sleep(3);
        NSLog(@"这是第一次%@",[ NSThread currentThread]);
    }];
    
    //3.封装操作
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

        sleep(4);
        NSLog(@"这是第二次%@",[ NSThread currentThread]);
    }];
    
    //4.合成数据
    NSBlockOperation *combine = [NSBlockOperation blockOperationWithBlock:^{
        
        sleep(5);
        
        //7.回到主线程刷新UI
        [[NSOperationQueue mainQueue]addOperationWithBlock:^{
            NSLog(@"刷新UI---%@",[NSThread currentThread]);
         }];
       }];
    
    //5.设置操作依赖
    [combine addDependency:op1];
    [combine addDependency:op2];
    
    //6.添加操作到队列中执行
    //可跨队列创建依赖
    [queue addOperation:op1];
    [queue addOperation:op2];
    [queue addOperation:combine];
    //或
    [queue addOperations:[op1,op2,combine] waitUntilFinished:NO];
    //Bool参数表示当前线程是否等待所有任务完成再返回。
}

你可能感兴趣的:(NSOperation)