`

嵌套的异步回调

 
阅读更多

今天被一个问题纠结了2个小时,一开始失败的代码大概是这样的:

dispatch_group_t group = dispatch_group_create();
                    
while([rs next]){

    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
                            
        [httpHelper getSecure:url completionHandler:^(NSDictionary* dict){
            // 子任务                               
        }];
    });
}
                    
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
    // 子任务全部完成后,才执行                        
});

本意是调用GCD的group API,处理完每个http请求的响应之后,才执行最后的总任务。但是由于httpHelper的getSecure:completionHandler:方法本身也有一个异步回调,所以上面的代码失效了

或者换一种写法,把dispatch_group_async写到getSecure的callback里面,也不行

最后终于找到一个救命帖:

gcd dispatch groups with an additional level of inception


应该写成这样:

dispatch_group_t group = dispatch_group_create();
                    
while([rs next]){

    dispatch_group_enter(group);

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
                            
        [httpHelper getSecure:url completionHandler:^(NSDictionary* dict){
            // 子任务
            dispatch_group_leave(group);                     
        }];
    });
}
                    
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
    // 子任务全部完成后,才执行                        
});


分享到:
评论

相关推荐

    Promise对象的链式调用(解决异步回调嵌套)

    Promise对象是解决异步回调嵌套的一种方案,现在封装Promise的库很多、像q,bluebrid等等。Promise对象下调用.then方法就可以把异步排个顺序,那么只要返回Promise对象、.then就可以继续下去 首先我们定义三个异步...

    使用Promise链式调用解决多个异步回调的问题

    主要给大家介绍了使用Promise链式调用解决多个异步回调问题的方法,文中给出了详细的介绍和示例代码,有需要的朋友可以参考借鉴,下面来一起学习学习吧。

    HTML+CSS3+JS+JQuery实现七夕言情动画、面向对象程序设计、Deferred对象解决异步编程回调嵌套问题

    HTML+CSS3+JS+JQuery实现七夕言情动画、面向对象程序设计、Deferred对象解决异步编程回调嵌套问题

    深入解析koa之异步回调处理

    异步非阻塞当然是它的一个优点,但大量的异步操作必然涉及大量的回调函数,特别是当异步嵌套的时候,就会出现回调金字塔的问题,使得代码的可读性非常差。比如下面一个例子: var fs = require('fs'); fs.readFile&...

    深入理解JS异步编程-Promise

    一是“回调地狱”,因为异步回调函数的特点:回调函数是作为异步函数的参数,一层一层嵌套,当嵌套过多,将使代码逻辑变得混乱,也无法做好错误捕捉和处理(只能在回调函数内部 try catch)。 二是回调的执行方式不...

    把微信小程序异步API转为Promise,简化异步编程,告别层层回调 ...

    微信官方没有给出Promise API来处理异步操作,而官方API异步的又非常多,这使得多异步编程会层层回调,代码一复杂,回调起来就想砸电脑。 于是写了一个通用工具,把微信官方的异步API转化为Promise,方便处理(多)...

    ES6的Promise对象的的介绍及用法(解决回调地狱问题)

    ES6的Promise对象可解决前端开发中常见的回调地狱问题(即大量异步回调函数的嵌套) 为异步编程提供了一种很好的解决方案 首先 什么是异步问题 例: 一个异步的读取文件的方法 const fs=require(fs) const path=...

    延续:JavaScript异步延续传递样式转换(不建议使用)

    Continuation.js引入了虚函数cont ,使您可以更轻松地编写连续传递样式代码(或异步回调样式代码)。 cont不是实际的函数,而是具有与JavaScript中的函数调用相同的语法的标记。 通过使用Continuation.js,您可以...

    Promise在微信小程序登录中的应用.pdf

    传统的异步回调嵌套方法造成程序可读性差,程序执行性能低下。而Promise的出现,解决了微信小程序获取微信用户信息时多个异步操作请求问题,对异步请求功能划分更明确,大大提高了程序的可读性,并提供了良好的错误处理...

    Android 集成支付宝支付

    1.亲测成功,支付宝支付,可直接嵌套到项目中 2.可以直接嵌套项目,标注详细 3.进行支付订单的操作接口操作完成后,进行异步回调成功、失败状态进行业务的逻辑

    js异步编程小技巧详解

    异步回调是js的一大特性,理解好用好这个特性可以写出很高质量的代码。分享一些实际用的一些异步编程技巧。 1.我们有些应用环境是需要等待两个http请求或IO操作返回后进行后续逻辑的处理。而这种情况使用回调嵌套...

    Router:您在寻找AsyncSync嵌套路由的解决方案吗?

    在的帮助下进行路由的同步或异步回调。 仅执行路由改变的嵌套路由器可能性。 这有助于避免在更改页面部分内容时重复执行调用或检查执行的必要性。 -您可以为任何路由级别设置回调函数; 如果与查询字符串不匹配,则...

    最详细的- ES6有哪些新特性?

    回调函数和异步编程是js特点之一,但是js中传统的回调函数编写太麻烦,如果嵌套的回调函数层级过多会导致回调地狱,代码很难看,因此promise在es6被引入用来解决这个问题。语法上Promise 是一个构造函数用来封装异步...

    理解JavaScript中Promise的使用

    从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的回调金字塔(Pyramid of Doom),绝对是一种糟糕的编程体验。于是便有了 CommonJS 的 Promises/A 规范,用于解决回调...

    跟我学习javascript解决异步编程异常方案

    JavaScript的异步调用基于回调函数,当多个异步事务多级依赖时,回调函数会形成多级的嵌套,代码变成 金字塔型结构。这不仅使得代码变难看难懂,更使得调试、重构的过程充满风险。 2、异常处理 回调嵌套不仅仅是使...

    浅谈js promise看这篇足够了

    大家都知道nodejs很快,为什么会这么快呢,原因就是node采用异步回调的方式来处理需要等待的事件,使得代码会继续往下执行不用在某个地方等待着。但是也有一个不好的地方,当我们有很多回调的时候,比如这个回调执行...

    cprof:MarkLogic Server 的条件分析(XQuery 和 XSLT)

    您想要的是一种分析您的主要请求的方法,并堆叠嵌套的评估配置文件直到查询结束。 然后,您可以决定如何处理所有分析器输出:显示、记录、通过电子邮件发送等。 这个 XQuery 库使这种模式变得简

    ES6一Promise对象(实用精简篇)

    在传统的异步编程中,如果异步之间存在依赖关系,只能使用层层嵌套的回调函数来满足这种依赖,如果嵌套的层数过多,降低可读性和可维护性,产生所谓的“回调地狱”。 Promise提供了全新的异步编程的一种解决方案。将...

    jobPostingApp

    TDD:使用 mocha 和 Chai 测试异步调用和嵌套回调 Bluebird 添加承诺,这将有助于保持更清晰的测试,摆脱嵌套的回调 codeship 运行测试,在 heroku 中进行构建和部署 supertest,通过测试将数据传递给我们的api 要...

    AngularJS中的promise用法分析

    JavaScript异步回调有好处也有坏处,回调函数大量嵌套十分复杂.所以javascript中还有另一种异步处理模式叫promises.在AngularJS中的实现就是$q服务. 下面是一些小例子. then,catch,finally 在链最后的 catch 为...

Global site tag (gtag.js) - Google Analytics