项目中需要控制首页多个弹框的顺序,用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);
};
});