美文网首页
GCD中的信号量-dispatch_semaphore

GCD中的信号量-dispatch_semaphore

作者: CALayer_Sai | 来源:发表于2017-05-09 10:30 被阅读0次

    今天跟朋友讨论了一个场景,他们的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循环理解为网络请求,当你全部请求完毕之后,才会执行新的操作。

    相关文章

      网友评论

          本文标题:GCD中的信号量-dispatch_semaphore

          本文链接:https://www.haomeiwen.com/subject/uejbtxtx.html