iOS 关于dispatch_semaphore_t(信号量) 和 dispatch_group_t (组) 线程执行顺序的使用

2017年,回望过去,前半年还致力于iOS开发,后半年就开始了python的漫漫之路,一路上走走停停,不过还好,总的来说,2017是收获的一年,也是付出的一年。2018加油!

话题转回来,关于线程执行的时候,大家可能会遇到一个问题,一个请求需要上一个请求的返回的数据作为参数,可是呢,你又想走异步操作,这时候问题就来了,还没有拿到上一个请求返回的参数,下一个请求已经开始操作了,就我而言的话,我会用三种方式进行:1.block回调,block的话直接block作为参数也可以实现  2. dispatch_semaphore_t(信号量) 3.dispatch_group_t  (组) 。关于Block的问题就不细说了,这里只说后两种


1.dispatch_semaphore_t(信号量)

这是需要用到的参数

/**
 关于异步操作按照信号量的顺序进行一步步返回
 * dispatch_semaphore_t 创建信号量,如果value小0 的话,这个信号量为空,
 * dispatch_semaphore_wait 可以让信号量减1,如果信号量是0,会等到信号量为非0再次进行下一步操作
 * dispatch_semaphore_signal 可以让信号量加1
 * 可以使用sleep进行区分执行顺序
 */
这是基本使用,任务操作会按照你自己设定的顺序进行操作,sleep()只是为了区分
- (void)testDispatch_sempaphore {
    
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    //进行异步操作
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        
        NSLog(@"异步操作1:%@", [NSThread currentThread]);
        dispatch_semaphore_signal(semaphore);
    });

    //异步操作2
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        sleep(2);
        NSLog(@"异步操作2:%@", [NSThread currentThread]);
        dispatch_semaphore_signal(semaphore);
    });
    //异步操作3
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        sleep(3);
        NSLog(@"异步操作3:%@", [NSThread currentThread]);
        dispatch_semaphore_signal(semaphore);
    });

}

2.dispatch_group_t  (组)

对于dispatch_group 大家都有了解,需要记得出入规则即可:先进先出

/**
 * dispatch_queue_t 操作
 * dispatch_group_t 任务组(进出规则:先进先出)
 * dispatch_group_enter  添加任务
 * dispatch_group_leave 任务完成
 * dispatch_group_wait 对子线程阻塞式超时操作,也就是所谓的任务最大时长
 * dispatch_enter和dispatch_leave要成对出现
 
 */


这里需要注意一下,要将dispatch_group_enter和dispatch_group_leave结对使用

- (void)testDispatch_group {
    //创建
    dispatch_queue_t quete = dispatch_queue_create("baby", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_enter(group);
    dispatch_group_async(group, quete, ^{
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            sleep(5);
            NSLog(@"使用dispatch_group1进行网络请求:%@", [NSThread currentThread]);
            dispatch_group_leave(group);
        });
        sleep(2);
//        dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5*NSEC_PER_SEC)));
        NSLog(@"队列1完成任务1:%@", [NSThread currentThread]);
    });
    
    dispatch_group_enter(group);
    dispatch_group_async(group, quete, ^{
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            sleep(5);
            NSLog(@"使用dispatch_group2进行网络请求:%@", [NSThread currentThread]);
            dispatch_group_leave(group);
        });
        sleep(2);
        NSLog(@"完成任务2:%@", [NSThread currentThread]);
    });

    dispatch_group_enter(group);
    dispatch_group_async(group, quete, ^{
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            sleep(5);
            NSLog(@"使用dispatch_group3进行网络请求:%@", [NSThread currentThread]);
            dispatch_group_leave(group);
        });
        sleep(2);
        NSLog(@"完成任务3:%@", [NSThread currentThread]);
    });
    sleep(2);
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"最后执行 ---- %@", [NSThread currentThread]);
    });

    
}


总结的也不一定全面,如有什么疑问,请加我扣扣:1123231279私聊我即可。

传送门:点击打开链接

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值