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

很多从事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。代码如下:

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

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

猜你喜欢

转载自blog.csdn.net/LiuChongFaye/article/details/81069485
今日推荐