iOS中经常会用到多线程,在多线程中有一个线程组的概念(group),创建多个线程组任务,多组任务都完成之后,就会进入dispatch_group_notify队列中。

同时多线程中还有一个信号量的概念(semaphore),信号量常用的方法有3个:

dispatch_semaphore_create 创建一个semaphore
dispatch_semaphore_signal 发送一个信号
dispatch_semaphore_wait 等待信号

执行dispatch_semaphore_create创建信号量并初始化信号值

dispatch_semaphore_signal 发送一个信号,信号量的信号值+1

dispatch_semaphore_wait 当信号量的值≤0时,执行等待,信号量的值>0时,则继续向下执行,并将信号量-1

在实际开发中经常会用到多网络请求并行,最后又需要统一处理请求结果这样的需求,这里就可以利用GCD的这些特点来完成。

    //创建group
dispatch_group_t group = dispatch_group_create(); //创建GCD组
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//创建信号量 并初始化信号量值为0
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
[HttpRequestUtil GET:Action_Home_Adv parameters:@{@"spaceId":@"1"} finished:^(AjaxResult *result) {
if (result.code == AjaxResultStateSuccess) { }
dispatch_semaphore_signal(sema);
}];
//由于信号量初始化值为0,所有当第一次执行到这里的时候信号量值仍然为0,程序就开始在这里等待信号量变化,前面异步的网络请求结束后,执行了dispatch_semaphore_signal(sema)方法,信号量+1,这样,dispatch_semaphore_wait监听到信号量由0变为1后,跳出等待,并且结束当前group队列
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
});

当多个gcd_group都被执行完毕,所有的组都已经完成之后,根据GCD_Group的特点,会执行dispatch_group_notify这个队列

    //把group_notify放在主队列中,这样可以在这个队列中刷新UI
dispatch_group_notify(group, dispatch_get_main_queue(), ^{ });

整体的思路就是利用GCD通过dispatch_group + 信号量来实现的。

通过group把多个请求分组,然后依次完成每个请求,当所有请求都有请求完成 会进入group_notify中,同时利用semaphore信号量的特点确保每个group执行完毕后,里面的网络请求也是请求完成的,最终在group_notify中完成数据的处理和界面的刷新

最新文章

  1. MySQL 之 Metadata Locking 研究
  2. Xcode调试技巧(断点和重构)
  3. 用一段JS代码来比较各浏览器的极限内存与运算速度
  4. linux shell编程学习笔记(一)---通配符,元字符
  5. Web日程管理FullCalendar
  6. 对TCP说三道四(三次握手)
  7. hdu1004----用java链表实现
  8. hibernate 三种状态的转换
  9. Github排序(转载)
  10. mysql性能优化之数据库级别优化--优化sql语句
  11. A1030. Travel Plan
  12. Expo大作战(三十五)--expo sdk api之Location!
  13. [cnblog新闻]历史性时刻:云硬件支出首次高于传统硬件
  14. 自学Aruba3.1-Aruba配置架构-WLAN配置架构
  15. DMA及cache一致性的学习心得 --dma_alloc_writecombine【转】
  16. Django与CSRF 、AJAX
  17. Luffy之虚拟环境.项目搭建,目录日志等配置信息
  18. 使用html2canvas将html标签转化为图片
  19. 第二章 企业项目开发--maven父子模块
  20. 学习C++从入门到精通的的十本最经典书籍

热门文章

  1. Dfs+Spfa【p1606】[USACO07FEB]荷叶塘Lilypad Pond
  2. Count Numbers with Unique Digits -- LeetCode
  3. hdu 4826 Labyrinth DP
  4. LRC CRC 纵向冗余码校验
  5. java拦截器与过滤器打印请求url与参数
  6. background属性总结,background-image路径问题相对于css和js
  7. js中typeof的用法汇总
  8. [置顶] zabbix通过lykchat发送告警信息配置过程
  9. 如何把自己的代码发布到npmjs(npm publish)
  10. DotnetBrowser高级教程-(5)使用内置的MVC UI框架-EasyMvc