首先感谢下热心观众,回复了若干个问题,没办法一一解答(有的我也不知道额- -)请见谅。
今天回复下@陈作君同学的提问:
“dispatch_concurrent_queue怎么像nsoperationqueue一样控制其中任务的并发数”
没理解错的话,应该指 NSOperationQueue 中的
maxConcurrentOperationCount 属性,它可以控制最大并发的 operation 数,但 GCD 的并行队列里貌似没有 API 来控制它。
随后我去翻了下,暂时也没找到某个直接的 API 能干这个事,但可以通过信号量的方式实现这个需求。
我们用global queue这个并发的queue做测试,假设有下面的代码:
运行的结果是这样的:
由于GCD内置的最大并发数(也就是它的线程池容量)在64个的样子,所以小于这个数的并发请求都是能同时start的。而且,我们不应该(貌似也不能)去更改GCD对自己线程池的维护方式。所以,若我们想实现并发数为3,可以在block进入queue之前就“拦一下”
上面的代码简单的利用了信号量将通过这个方法执行的block并发数维持在3个,刚才的测试代码换成这个函数后:
运行结果:
在同一时刻就最多有3个线程在干活儿了。希望题主是这个意思- -
刚才这个dispatch_async_limit_3只是测试用,真的要用在工程里的时候还是要注意,dispatch_semaphore_wait 方法在等待信号量时是会卡住当前线程的,谁也不想调用它的时候很可能被卡住(尤其是主线程),所以更好的方案是将信号量等待的操作放在另一个串行线程中:
大概就是这样了