美文网首页I love iOSiOS开发攻城狮的集散地iOS 进阶
iOS-浅谈并发任务GCD信号量与其替代品Bolts(Faceb

iOS-浅谈并发任务GCD信号量与其替代品Bolts(Faceb

作者: 狼居胥侯 | 来源:发表于2018-07-16 14:11 被阅读76次

很多从事iOS开发过程当中很少听到信号量,也很少用到,但是这个在小编看来是非常重要的思想。今天小编就来说说信号量以及信号量的完美替代品Bolts(Facebook出品的库)。

先想想这样一个场景:启动app之后,需要先并发发送两个数据请求requestA与requestB,同时这两个数据请求还会做一些数据存储方面的工作,然后当requestA与requestB都完成之后,再做数据请求requestC。(记住一点:requestC一定要在requestA与requestB都完成之后才能执行)

以下是我找到的一个流程图:

图1:流程图

我们应该知道这绝对是一个很常见的需求,很多人在看到这个需求是很自然的想到使用NSOperation+NSNotificationCenter来实现,但是这样就费尽了。

在小编看来:常见的需求与场景苹果(或者其余的公司,比如谷歌,Facebook,微软等)绝对也会想到了,毕竟他们公司的编程能力远胜于我们。既然他们想到了,那必然在SDK当中必然是集成了

放到iOS开发当中,苹果就提供了一个方案那就是GCD信号量

GCD信号量的使用涉及到三个方法,分别是:

1.dispatch_semaphore_create(创建一个信号量)

2.dispatch_semaphore_signal(发送一个信号)

3.dispatch_semaphore_wait(等待)

以下便是信号量的简单使用:

图2:信号量的使用

执行结果如下:

图3:代码执行结果

由图2可以看到线程3在线程1和线程2执行完毕之后才执行,这就是信号量的使用。此外,信号量还有很多功能,有时间的可以自行研究。

但是这样写的话我是看着不太习惯,而且这个也是需要写逻辑的,很可能出现bug,比如少写dispatch_semaphore_wait等。

信号量是给了这么一个解决问题的思路,很多第三方库也是实现了此类的功能,其中Facebook出品的Bolts就是最好用的。

废话不多说,直接上代码:

图4:数据请求1 图5:数据请求2,同图4 图6:task1与task2并行执行

使用Bolts实现多个数据请求并发就是这么简单。

除此之外,Bolts还有更加广泛的功能,比如:先执行task1,task1成功之后再执行task2。代码如下:

图7:task1与task2串行

github链接SemaphoreAndBolts,可以设置task1与task2中的isSuccess以及Bolts的官方文档来综合学习Bolts。

最后小编要说一句:Facebook出品,必属精品

相关文章

  • iOS-浅谈并发任务GCD信号量与其替代品Bolts(Faceb

    很多从事iOS开发过程当中很少听到信号量,也很少用到,但是这个在小编看来是非常重要的思想。今天小编就来说说信号量以...

  • iOS 顺序执行

    打印结果 GCD 信号量控制并发 (dispatch_semaphore)

  • Swift多线程:GCD进阶,单例、信号量、任务组

    Swift多线程:GCD进阶,单例、信号量、任务组 Swift多线程:GCD进阶,单例、信号量、任务组

  • iOS 并发机制

    ios 并发机制(一) —— GCD中的信号量及几个重要函数ios 并发机制(二) —— NSOperation实...

  • GCD 文章理解

    GCD详解 1,GCD如何控制线程的最大并发数? (1,通过信号量的大小控制线成并发执行的数量) (2,一定数量的...

  • iOS底层--GCD应用

    手动目录GCD简介信号量信号量的理解信号量的使用信号量的代码实操信号量阻塞哪里的任务?栅栏函数dispatch_b...

  • GCD 在swift中的使用

    ##GCD简单介绍 1、Dispatch Semaphores:信号量,可以让我们实现更加复杂的并发控制,防止资源...

  • GCD的学习笔记(One)

    并行和并发 GCD简介 GCD的任务 GCD的队列 GCD创建队列或获取队列的方法 任务的执行方式:同步执行(同步...

  • 06进阶之路-多线程管理

    1. GCD相关 学习链接 GCD 简介 (多核编程管理线程) GCD 任务和队列(同步和异步任务 并发和串行队列...

  • 多线程之GCD线程安全

    GCD 信号量:dispatch_semaphore GCD 中的信号量是指Dispatch Semaphore,...

网友评论

  • 狼居胥侯:各位读者,这个是加速不需要使用信号量,只使用dispatch_group_t就可以,还有使用NSOperation建立依赖关系也可以实现,用信号量似乎更麻烦了:sweat_smile:
  • LD_X:这个确实好用,第一次看到是在论坛的一个帖子里,token定期失效,没有确保定期更新。其他请求可以排队等待这个token刷新完。http://test.www.cocoachina.com/bbs/read.php?tid-1728238.html,不过有警告提示。

本文标题:iOS-浅谈并发任务GCD信号量与其替代品Bolts(Faceb

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