GCD中的信号量-dispatch_semaphore

2017-05-09  本文已影响0人  CALayer_Sai

今天跟朋友讨论了一个场景,他们的APP一个页面里面有三个网络请求,且第三个请求所需的参数是基于前两个请求结果的,但是AFN又都是异步执行,不能保证数据的正确返回。这个类似于直播里面的弹幕实现,比如有5条弹幕了再去请求,防止多次请求造成的页面卡顿。

1、信号量主要有3个函数,分别是:

//创建信号量,参数:信号量的初值,如果小于0则会返回NULL

dispatch_semaphore_create(信号量值)

//等待降低信号量

dispatch_semaphore_wait(信号量,等待时间)

//提高信号量

dispatch_semaphore_signal(信号量)

2、代码部分的简单实现

-(void)dispatchSignal{

//crate的value表示,最多几个资源可访问

dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);

dispatch_queue_t quene = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//任务1

dispatch_async(quene, ^{

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

NSLog(@"run task 1");

sleep(1);

NSLog(@"complete task 1");

dispatch_semaphore_signal(semaphore);

});

//任务2

dispatch_async(quene, ^{

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

NSLog(@"run task 2");

sleep(1);

NSLog(@"complete task 2");

dispatch_semaphore_signal(semaphore);

});

//任务3

dispatch_async(quene, ^{

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

NSLog(@"run task 3");

sleep(1);

NSLog(@"complete task 3");

dispatch_semaphore_signal(semaphore);

});

}

打印结果:

可以得到的结果是:由于设定的信号值为2,先执行两个线程,等执行完一个,才会继续执行下一个,保证同一时间执行的线程数不超过2。

如果我们的初始值设定为1,那么:

设置为3:

即三个线程同时执行。

我们可以简答的做个测试:

输出结果是:

这样效果看着更直观,可以把for循环理解为网络请求,当你全部请求完毕之后,才会执行新的操作。

上一篇 下一篇

猜你喜欢

热点阅读