嵌套的异步回调

今天被一个问题纠结了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), ^{
    // 子任务全部完成后,才执行
});

嵌套的异步回调,布布扣,bubuko.com

时间: 2024-10-12 13:09:55

嵌套的异步回调的相关文章

从一个nodejs爬虫来看nodejs异步回调嵌套时数据的安全性[原创,未经授权禁止转载]

代码如下: /** * Created by Totooria Hyperion on 2016/4/20. */ 'use strict'; const fs = require('fs');const path = require('path');const cheerio = require('cheerio');const request = require('request'); function getCategoryByUrl(url,callback){ request(url,

jquery.Deferred promise解决异步回调

我们先来看一下编写AJAX编码经常遇到的几个问题: 1.由于AJAX是异步的,所有依赖AJAX返回结果的代码必需写在AJAX回调函数中.这就不可避免地形成了嵌套,ajax等异步操作越多,嵌套层次就会越深,代码可读性就会越差. $.ajax({ url: url, data: dataObject, success: function(){ console.log("I depend on ajax result."); }, error: function(){} }); consol

关于C10K、异步回调、协程、同步阻塞

最近到处在争论这些话题,发现很多人对一些基础的常识并不了解,在此发表一文做一下解释.此文未必能解答所有问题,各位能有一个大致的了解就好. C10K的由来 大家都知道互联网的基础就是网络通信,早期的互联网可以说是一个小群体的集合.互联网还不够普及,用户也不多.一台服务器同时在线100个用户估计 在当时已经算是大型应用了.所以并不存在什么C10K的难题.互联网的爆发期应该是在www网站,浏览器,雅虎出现后.最早的互联网称之为Web1.0, 互联网大部分的使用场景是下载一个Html页面,用户在浏览器中

如何优雅的处理Nodejs中的异步回调

前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O的操作结果基本上都需要在回调函数中处理,比如下面的这个读取文件内容的函数: fs.readFile('/etc/passwd', function (err, data) { if (err) throw err; console.log(data); }); 那,我们读取两个文件,将这两个文件的内

Nodejs异步回调的优雅处理方法

这篇文章主要介绍了Nodejs异步回调的优雅处理方法,本文使用了ES6中的新特性,用一种十分优雅的方式解决了回调问题,需要的朋友可以参考下 前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O的操 作结果基本上都需要在回调函数中处理,比如下面的这个读取文件内容的函数: 复制代码 代码如下: fs.readFile('/etc/passwd', fun

vue和jQuery嵌套实现异步ajax通信

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible&qu

js异步回调Async/Await与Promise区别 新学习使用Async/Await

Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面一起来看看这篇文章:Async/Await替代Promise的6个理由. 什么是Async/Await? async/await是写异步代码的新方式,以前的方法有回调函数和Promise. async/await是基于Promise实现的,它不能用于普通的回调函数. async/await与Prom

C#的异步回调函数

关于C#的异步回调,在ActionScript 3.0当中 , 有关键字Function , 可以直接传class函数为回调函数.但是在C#当中,需要使用到委托,其中应用的最多的当属 : Action / Func .当然你可以使用关键字delegate来自定义委托.这里翼Action /  Func为例来讲解C#的异步回调,如果不了解C#的委托机制,需要自己先百度/Google一下,再来看这篇博客. BeginInvoke 方法用于启动异步调用.它与您需要异步执行的方法具有相同的参数,只不过还

java 中的异步回调

异步回调,本来在c#中是一件极为简单和优雅的事情,想不到在java的世界里,却如此烦琐,先看下类图: 先定义了一个CallBackTask,做为外层的面子工程,其主要工作为start 开始一个异步操作,然而真正干活的是CallBackBody,它里面的execute才是真正要处理的事情,如果成功,则触发onSucess,否则触发onFailure. CallBackApp做为最终的运行舞台,这里面还得单独跑一个线程,来启动CallBackTask,这样才不会阻塞后面的处理. CallBackBo