A B 执行完后执行C

2020-10-24  本文已影响0人  adaodao3056
dispatch_async(queue, block1_for_reading)  
dispatch_async(queue, block2_for_reading)

dispatch_barrier_async(queue, block_for_writing)

dispatch_async(queue, block3_for_reading)  
dispatch_async(queue, block4_for_reading) 
    //创建分组

    dispatch_group_t group =dispatch_group_create();

    //创建队列

    dispatch_queue_t queue =dispatch_queue_create("queue",DISPATCH_QUEUE_CONCURRENT);

    //往分组中添加任务

    dispatch_group_async(group, queue, ^{

        [NSThreadsleepForTimeInterval:2];//模拟耗时操作

        NSLog(@"11111 %@", [NSThreadcurrentThread]);

    });

    //往分组中添加任务

    dispatch_group_async(group, queue, ^{

        [NSThreadsleepForTimeInterval:1];//模拟耗时操作

        NSLog(@"2222 %@", [NSThreadcurrentThread]);

    });

    //分组中任务完成以后通知该block执行

    dispatch_group_notify(group, queue, ^{

        NSLog(@"完成 %@", [NSThreadcurrentThread]);

        dispatch_async(dispatch_get_main_queue(), ^{

            NSLog(@"通知主线程刷新UI %@", [NSThreadcurrentThread]);

        });

    });
dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //任务1
    dispatch_async(queue, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"run task 1");
        sleep(1);
        NSLog(@"complete task 1");
        dispatch_semaphore_signal(semaphore);
    });
    //任务2
    dispatch_async(queue, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"run task 2");
        sleep(1);
        NSLog(@"complete task 2");
        dispatch_semaphore_signal(semaphore);
    });
    //任务3
    dispatch_async(queue, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"run task 3");
        sleep(1);
        NSLog(@"complete task 3");
        dispatch_semaphore_signal(semaphore);
    });
2019-02-24 18:31:02.447769+0800 Semaphore[33286:12284312] run task 1
2019-02-24 18:31:02.447767+0800 Semaphore[33286:12284310] run task 2
2019-02-24 18:31:03.450756+0800 Semaphore[33286:12284312] complete task 1
2019-02-24 18:31:03.450756+0800 Semaphore[33286:12284310] complete task 2
2019-02-24 18:31:03.450997+0800 Semaphore[33286:12284311] run task 3
2019-02-24 18:31:04.454259+0800 Semaphore[33286:12284311] complete task 3

#pragma mark -依赖关系
-(void)dependcy
{
    /**
     举例场景:
     1. 下载一个小说的压缩包
     2. 解压缩,删除压缩包
     3. 更新UI
     */
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载一个小说的压缩包,%@",[NSThread currentThread]);
    }];
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"解压缩,删除压缩包,%@",[NSThread currentThread]);
    }];
    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"更新UI,%@",[NSThread currentThread]);
    }];
    // 如果直接把任务添加到队里,会异步执行,使顺序错乱
    
    // 因此需要指定任务之间的依赖关系--------依赖关系可以跨队列(可以在子线程下载完,到主线程更新UI)
    [op2 addDependency:op1];  // op2 依赖于op1  就是执行op2之前必须先执行op1
    [op3 addDependency:op2];  // op3 依赖于op2  就是执行op3之前必须先执行op2
    
    /**
     千万注意:不要造成相互依赖即依赖循环,会造成死锁
     */
    //    [op1 addDependency:op3];
    
    
    // waitUntilFinished 类似于GCD中调度组的通知
    // NO表示不等待当前的队列执行完毕,就执行下面的代码,打印 NSLog(@"任务完成");
    // YES 表示必须等队列内的任务全部执行完毕才执行下面的代码
    [ self.opQueue addOperations:@[op1, op2] waitUntilFinished:YES];
    
    // 在主线程更新UI
    [[NSOperationQueue mainQueue] addOperation:op3];
    
    NSLog(@"任务完成");
}
@end

上一篇 下一篇

猜你喜欢

热点阅读