GCD 并发流程控制

最近在项目中有一需求:假设有三个异步请求A、B、C,等这三个异步请求完成之后,通知程序执行D方法,但又不要阻塞线程!貌似面试的时候面试官也喜欢问这种问题,第一反应是用GCD处理,之前也看过一些GCD资料,但是没有实际操作过,今天网上又看了下GCD的资料,找到了简单的解决办法!
用最简单的办法去解决复杂的问题!!!

附以下代码:


dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
/**创建dispatch组*/
dispatch_group_t group = dispatch_group_create();

for (NSInteger i = 0; i < 10; i++) {
    dispatch_group_enter(group);
    dispatch_group_async(group, queue, ^{
        /**此处是异步请求*/
        [WBRequestManager startGETRequestHost:(NSString *)host urlString:urlString argument:param completionBlock:^(WBResponseModel *model) {
            dispatch_group_leave(group);
        }];
    });
}
/**为group设置通知一个block,当group关联的block执行完毕后,就调用这个block*/
dispatch_group_notify(group, queue, ^{
    NSLog(@"It's done!!!");
});

PS: 手动管理group关联的block的运行状态(或计数),进入和退出group次数必须匹配

dispatch_group_enter(group);
dispatch_group_leave(group);

之前看GCD相关内容,将想要执行的代码写入下面block块中:

dispatch_group_async(group, queue, ^{
    /**此处写要执行的代码*/
});

说是和调用dispatch_group_enter(group); dispatch_group_leave(group);
等价的,经测试,其实不等价,dispatch_group_async里面只好执行同步的方法,如果是异步的请求,并不会等请求返回结果后再通知dispatch_group_notify进行处理!


信号量处理异步请求

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

dispatch_group_async(group, queue, ^{ 
    [WBRequestManager startGETRequestHost:(NSString *)host urlString:urlString argument:param completionBlock:^(WBResponseModel *model) {
            dispatch_semaphore_signal(semaphore);
        }];
});

dispatch_group_async(group, queue, ^{ 
    [WBRequestManager startGETRequestHost:(NSString *)host urlString:urlString argument:param completionBlock:^(WBResponseModel *model) {
            dispatch_semaphore_signal(semaphore);
        }];
});

dispatch_group_notify(group, queue, ^{
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.tableView reloadData];
    });
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • NSThread 第一种:通过NSThread的对象方法 NSThread *thread = [[NSThrea...
    攻城狮GG阅读 869评论 0 3
  • 背景 担心了两周的我终于轮到去医院做胃镜检查了!去的时候我都想好了最坏的可能(胃癌),之前在网上查的症状都很相似。...
    Dely阅读 9,296评论 21 42
  • 程序中同步和异步是什么意思?有什么区别? 解释一:异步调用是通过使用单独的线程执行的。原始线程启动异步调用,异步调...
    风继续吹0阅读 1,062评论 1 2
  • 不语亦无声 众说纷纷 勿闻也 谁晓吾心声 应放耳言心 良行有几何 不骄亦无糟 领先曹操 毋妄耶 谁人语卿叨 请触心...
    本宫来自现代阅读 139评论 0 0
  • 大三的那年,学校里流行去做兼职。就是利用周末去超市做促销员。在一个学姐的帮助下迎来了我的第一次促销活动--到中街的...
    欣寳dx阅读 278评论 3 2