博客> GCD的高级用法
GCD的高级用法
2017-11-23 10:25 评论:0 阅读:619 蓝波大人
ios GCD

1.组任务dispatch_group

dispatch_group_async 监视一组block任务的完成,多个任务都结束后 的一个汇总处理,可以同步或异步地监视

dispatch_group_notify 所有任务执行结束汇总,不阻塞当前线程 ,一般情况下不推荐使用

dispatch_group_wait 等待直到所有任务执行结束,中途不能取消,阻塞当前线程

如果wait里面的参数变为等待多少秒,即经过这个时间后,不管任务有没有执行完,都要汇总结果。 long result = dispatch_group_wait(group, time); 且如果结果是0那么就是所有任务都执行完成,不是0就是还有任务正在执行

2.多元调用dispatch_apply

dispatch_apply 提交一个多元调用的block块到队列里面,并且等待block任务的所有迭代完成之后才返回,可以实现一个高性能的循环迭代

高效循环实现原理:将循环的每次迭代提交到dispatch queue进行处理,结合并发queue使用时,可以并发地执行迭代以提高性能。但是也不是任何一个循环都需要用dispatch_apply来替换,因为dispatch queue还是存在一些开销的,虽然非常小。所以只有当你的循环代码拥有足够的工作量,才能忽略掉dispatch queue的这些开销以提高性能。 得出来得结果由于是多线程,所有是无序得但是每个索引对应的指还是一样的。

dispatch_apply 会阻塞当前线程,推荐在 dispatch_async 中执行

dispatch_apply 函数结合concurrent queue,dispatch_apply能实现一个高性能的循环迭代

语句的含义: 第一个参数:次数;第三个参数:block块里面的形参是区分第几次,次数自动增加 dispatch_apply(arr.count, queue, ^(size_t index)

3.设立障碍dispatch_barrier_async

dispatch_barrier_async 提交一个 异步执行的带障碍的block块 到队列里面并且直接返回

使用 dispatch_barrier_async,需要指定通过dispatch_queue_create函数创建的一个 concurrent queue

在barrier任务之前的所有任务将并行执行,任何在此之后提交的任务将不会执行直到 barrier这个任务执行完成后,后面的任务也是并发执行

4.信号dispatch_semaphore_t 持有计数的信号,使用计数来实现该信号功能。计数为0时等待,计数大于等于1 时,减去1,而不等待

dispatch_semaphore_create 创建新的计数信号 ,如果创建的是1的计数信号,那么并发数就是一

dispatch_semaphore_wait 等待直到计数值>=1

dispatch_semaphore_signal 发信号,使原来的信号计数值+1

5.利用信号模拟迅雷下载的实现 原理:设置最大的并发量为一次下载的数量

实现的原理:创建了一个初使值为4的信号,每一次for循环都会创建一个新的线程,线程执行之前会根据信号量来判断是否要等待,前4个线程会分别获取一个信号,这时候信号量就为0了,然后就导致了其他的6个线程进入等待。当前4个线程有一个执行完了,就会发信号使信号量变成1,这时候6个线程中的一个线程就不需要等待了,如此就形成了对并发的控制

//设置并发数为4 dispatch_semaphore_t semaphore = dispatch_semaphore_create(4); dispatch_queue_t queue = dispatch_get_global_queue(0, 0); dispatch_group_t group = dispatch_group_create(); for (int i =0; i<=10; i++) { //如果不使用group分组任务,那么就是只有一个线程,多个任务同时添加到一个线程,这样会造成阻塞,使用之后就是形成多线程 dispatch_group_async(group, queue, ^{ //执行之前先判断信号量。信号量为0时等待,大于等于1时,减1而不等待 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); [NSThreadsleepForTimeInterval:2]; NSLog(@"%d",i); //执行一组任务后,发信号使信号量的计数加一,执行下一组任务 dispatch_semaphore_signal(semaphore) }); } //任务汇总 dispatch_group_wait (group, DISPATCH_TIME_FOREVER);

收藏
0
sina weixin mail 回到顶部