iOS 多线程GCD之信号量

80 阅读1分钟

项目中需要控制首页多个弹框的顺序,用GCD的信号量来实现,顺便学习一下 最重要的三个函数:

1、dispatch_semaphore_create创建一个Semaphore并初始化信号的总量

2、dispatch_semaphore_signal发送一个信号,让信号总量加1

3、dispatch_semaphore_wait可以使总信号量减1,当信号总量为0时就会一直等待(阻塞所在线程),否则就可以正常执行。

使用场景: 1、保持线程同步,将异步执行任务转换为同步执行任务
2、保证线程安全,为线程加锁

//创建一个队列,用于操作信号量
dispatch_queue_t queue = dispatch_queue_create("Order", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
//创建一个初始为0的信号量
    dispatch_semaphore_t sema = dispatch_semaphore_create(0);
    dispatch_async(dispatch_get_main_queue(), ^{
        //弹窗1
        PopView *view1 = [[PopView alloc] init];
        [view1 show];
        view1.callback = ^{
            dispatch_semaphore_signal(sema);
         };
    });
    //等待信号触发
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    dispatch_async(queue, ^{
        //弹窗2
        PopView *view2 = [[PopView alloc] init];
        [view2 show];
        view2.callback = ^{
            dispatch_semaphore_signal(sema);
        };
    });