您的当前位置:首页正文

NSBlockOperation使用

来源:华佗小知识
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    //手动设置任务之间依赖关系,进而改变自动的执行顺序
    [self createDependency];
}

- (void)createDependency {
    /*需求:往非主队列中添加三个任务Task1;Task2;Task3
      自动执行顺序:三个任务同时执行
      改后的执行顺序:任务三等待任务一和任务二执行完毕,才执行
      依赖关系:task3->task2; task3->task1
     */
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    NSBlockOperation *firstOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"开始下载图片一...");
        [NSThread sleepForTimeInterval:3];
        NSLog(@"下载图片一完成");
    }];
    NSBlockOperation *secondOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"开始下载图片二...");
        [NSThread sleepForTimeInterval:5];
        NSLog(@"下载图片二完成");
    }];
    NSBlockOperation *thirdOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载图片三");
    }];
    //设置/添加依赖关系
    /* 注意点:
       1. 千万不要造成循环依赖(死锁)
       2. 依赖关系在添加到队列之前
     */
    [thirdOperation addDependency:firstOperation];
    [thirdOperation addDependency:secondOperation];
    [queue addOperation:firstOperation];
    [queue addOperation:secondOperation];
    [queue addOperation:thirdOperation];
}

//同步执行
- (IBAction)blockSync:(id)sender {
    //1.创建操作对象
    NSBlockOperation *operation = [[NSBlockOperation alloc] init];
    //2.添加任务
    [operation addExecutionBlock:^{
        //要执行的任务
        NSLog(@"下载图片一:%@", [NSThread currentThread]);
    }];
    [operation addExecutionBlock:^{
        //要执行的任务
        NSLog(@"下载图片二:%@", [NSThread currentThread]);
    }];
    [operation addExecutionBlock:^{
        //要执行的任务
        NSLog(@"下载图片三:%@", [NSThread currentThread]);
    }];
    [operation addExecutionBlock:^{
        //要执行的任务
        NSLog(@"下载图片四:%@", [NSThread currentThread]);
    }];
    [operation addExecutionBlock:^{
        //要执行的任务
        NSLog(@"下载图片五:%@", [NSThread currentThread]);
    }];
    //3.执行任务(同步执行任务几乎不用;没有规律)
    [operation start];
}
//异步执行 -》保证子线程执行
- (IBAction)blockAsync:(id)sender {
    //1.创建操作对象(方式二:常用; 创建和添加任务合二为一)
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载图片一:%@", [NSThread currentThread]);
    }];
    NSBlockOperation *anotherOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载图片二:%@", [NSThread currentThread]);
        //回到主线程(获取主队列)
//        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
//            //主线程执行
//            NSLog(@"回到主线程更新界面:%@", [NSThread currentThread]);
//        }];
    }];
    
    NSBlockOperation *thirdOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载图片三....%@",[NSThread currentThread]);
    }];
    NSBlockOperation *forthOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载图片四....%@", [NSThread currentThread]);
    }];
    NSBlockOperation *fifthOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载图片五....%@", [NSThread currentThread]);
    }];
    NSBlockOperation *sixthOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载图片六....%@", [NSThread currentThread]);
    }];
    
    //2.创建非主队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    //2.1 设置最大同时执行的任务的个数
    queue.maxConcurrentOperationCount = 2;
    //3.操作对象放到非主队列中(自动执行)
    [queue addOperation:operation];
    [queue addOperation:anotherOperation];
    [queue addOperation:thirdOperation];
    [queue addOperation:forthOperation];
    [queue addOperation:fifthOperation];
    [queue addOperation:sixthOperation];
    
//    //如何暂停队列中的所有任务;
//    [queue setSuspended:YES];
//    //把队列中的所有暂停的任务重新启动
//    [queue setSuspended:NO];
//    //如何取消队列中的所有任务(不会恢复;从队列中移除)
//    [queue cancelAllOperations];
}