dispatch_group控制多个并发请求
2017-11-27 16:51
806 查看
场景
在开发过程中会经常出现这样的一个场景,就是需要刷新一个界面数据,而这个界面数据需要发起多个请求才能获得,例如:一个用户信息界面,包括基本数据,关联数据,其他特别数据等,这几种数据存在相互依赖的关系,并且获取每种数据的api不同,需要同时异步发起多个请求。在这种场景下面,就需要有一种线程同步机制来处理。通常多线程同步用得最多的就是信号量。不过,直接使用信号量不但代码上面相对松散,还会存在悬挂等问题。GCD已经提供了dispatch_group来很好的实现同步问题。
实现方式
在上述场景中,使用dispatch_group一般流程如下:
说明:
在开发过程中会经常出现这样的一个场景,就是需要刷新一个界面数据,而这个界面数据需要发起多个请求才能获得,例如:一个用户信息界面,包括基本数据,关联数据,其他特别数据等,这几种数据存在相互依赖的关系,并且获取每种数据的api不同,需要同时异步发起多个请求。在这种场景下面,就需要有一种线程同步机制来处理。通常多线程同步用得最多的就是信号量。不过,直接使用信号量不但代码上面相对松散,还会存在悬挂等问题。GCD已经提供了dispatch_group来很好的实现同步问题。
实现方式
在上述场景中,使用dispatch_group一般流程如下:
创建一个group: dispatch_group_t group = dispatch_group_create(); 把一个异步操作加入到group中 dispatch_group_enter(group); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ * dispatch_group_leave(group); }); 等待group完成所有异步操作 dispatch_group_notify(group, dispatch_get_main_queue(), ^{ });
说明:
dispatch_group_notify:当group中所有的block操作都完成后才会执行,不会阻塞当前调用线程,如果需要阻塞当前调用线程,可使用dispatch_group_wait(group, DISPATCH_TIME_FOREVER); dispatch_group_enter:增加当前group执行block数 dispatch_group_leave:减少当前group执行block数
相关文章推荐
- 多线程并发流程控制之dispatch_group 有关函数
- 多线程并发流程控制之dispatch_group 有关函数
- ios 多线程控制线程并发数、GCD之dispatch_group、GCD信号量
- 多线程并发流程控制之dispatch_group 有关函数
- GCD 信号量控制并发(dispatch_semaphore)以及dispatch_group_async
- 多线程并发控制dispatch_group
- AJAX中同时发送多个请求(并发)对象处理方法
- GCD 信号量控制并发 (dispatch_semaphore)
- 利用GCD信号量(dispatch_semaphore)控制并发
- iOS --- GCD 信号量控制并发 (dispatch_semaphore)
- dispatch_group实践,AFN3.0多个网络请求
- GCD 信号量控制并发 (dispatch_semaphore)
- js控制异步请求数量 标签: js异步并发
- iOS之利用GCD信号量控制并发网络请求
- WCF并发(Concurrency)的本质:同一个服务实例上下文(InstanceContext)同时处理多个服务调用请求
- 巧妙实现缺角radiogroup控制多个fragment切换和滑动
- GCD 信号量控制并发 (dispatch_semaphore)
- JS中如何处理多个ajax并发请求?
- 控制服务器处理请求的数量(高并发)-防止用户重复点击导致多次请求
- 巧妙实现缺角radiogroup控制多个fragment切换和滑动