很多从事iOS开发过程当中很少听到信号量,也很少用到,但是这个在小编看来是非常重要的思想。今天小编就来说说信号量以及信号量的完美替代品Bolts(Facebook出品的库)。
先想想这样一个场景:启动app之后,需要先并发发送两个数据请求requestA与requestB,同时这两个数据请求还会做一些数据存储方面的工作,然后当requestA与requestB都完成之后,再做数据请求requestC。(记住一点:requestC一定要在requestA与requestB都完成之后才能执行)。
以下是我找到的一个流程图:
我们应该知道这绝对是一个很常见的需求,很多人在看到这个需求是很自然的想到使用NSOperation+NSNotificationCenter来实现,但是这样就费尽了。
在小编看来:常见的需求与场景苹果(或者其余的公司,比如谷歌,Facebook,微软等)绝对也会想到了,毕竟他们公司的编程能力远胜于我们。既然他们想到了,那必然在SDK当中必然是集成了。
放到iOS开发当中,苹果就提供了一个方案那就是GCD信号量。
GCD信号量的使用涉及到三个方法,分别是:
1.dispatch_semaphore_create(创建一个信号量)
2.dispatch_semaphore_signal(发送一个信号)
3.dispatch_semaphore_wait(等待)
以下便是信号量的简单使用:
执行结果如下:
由图2可以看到线程3在线程1和线程2执行完毕之后才执行,这就是信号量的使用。此外,信号量还有很多功能,有时间的可以自行研究。
但是这样写的话我是看着不太习惯,而且这个也是需要写逻辑的,很可能出现bug,比如少写dispatch_semaphore_wait等。
信号量是给了这么一个解决问题的思路,很多第三方库也是实现了此类的功能,其中Facebook出品的Bolts就是最好用的。
废话不多说,直接上代码:
使用Bolts实现多个数据请求并发就是这么简单。
除此之外,Bolts还有更加广泛的功能,比如:先执行task1,task1成功之后再执行task2。代码如下:
github链接SemaphoreAndBolts,可以设置task1与task2中的isSuccess以及Bolts的官方文档来综合学习Bolts。
最后小编要说一句:Facebook出品,必属精品。