iOS 多网络请求同步并发
2024-09-07 01:21:52
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中完成数据的处理和界面的刷新
最新文章
- MySQL 之 Metadata Locking 研究
- Xcode调试技巧(断点和重构)
- 用一段JS代码来比较各浏览器的极限内存与运算速度
- linux shell编程学习笔记(一)---通配符,元字符
- Web日程管理FullCalendar
- 对TCP说三道四(三次握手)
- hdu1004----用java链表实现
- hibernate 三种状态的转换
- Github排序(转载)
- mysql性能优化之数据库级别优化--优化sql语句
- A1030. Travel Plan
- Expo大作战(三十五)--expo sdk api之Location!
- [cnblog新闻]历史性时刻:云硬件支出首次高于传统硬件
- 自学Aruba3.1-Aruba配置架构-WLAN配置架构
- DMA及cache一致性的学习心得 --dma_alloc_writecombine【转】
- Django与CSRF 、AJAX
- Luffy之虚拟环境.项目搭建,目录日志等配置信息
- 使用html2canvas将html标签转化为图片
- 第二章 企业项目开发--maven父子模块
- 学习C++从入门到精通的的十本最经典书籍
热门文章
- Dfs+Spfa【p1606】[USACO07FEB]荷叶塘Lilypad Pond
- Count Numbers with Unique Digits -- LeetCode
- hdu 4826 Labyrinth DP
- LRC CRC 纵向冗余码校验
- java拦截器与过滤器打印请求url与参数
- background属性总结,background-image路径问题相对于css和js
- js中typeof的用法汇总
- [置顶]
 zabbix通过lykchat发送告警信息配置过程
- 如何把自己的代码发布到npmjs(npm publish)
- DotnetBrowser高级教程-(5)使用内置的MVC UI框架-EasyMvc