ios嵌套的异步并行任务场景

场景1:

从数据源读到N个值,然后需要遍历这N个值,分别发起http请求。处理完成之后,调用一个最终汇总的方法

这个场景如果用js的async框架,很容易就能实现:

async.series([task1, task2, task3], function(err){
    // 汇总代码
});

function task1(callback){
    // http请求
    callback(null);
}

function task2(callback){
    // http请求
    callback(null);
}

function task3(callback){
    // http请求
    callback(null);
}

但是在ios里,就比较麻烦,最后是用dispatch_group实现的:

dispatch_group_t group = dispatch_group_create();

while([rs next]){

    dispatch_group_enter(group);

    [syncService refreshMembersWithEnterpriseId:enterpriseId LatestSyncTime:latestSyncDate Block:^(BOOL flag){
        dispatch_group_leave(group);
    }];
}        

dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    // 汇总代码
});

场景2:

后来需求变化了,场景更复杂了点。针对每个值,都要发起多个http请求(场景1只需要请求1次)。所有请求都结束以后,再调用汇总方法

所以一开始我写成类似这样:

dispatch_group_t group = dispatch_group_create();

while([rs next]){

    dispatch_group_enter(group);

    dispatch_group_t group_inner = dispatch_group_create();

    dispatch_group_enter(group_inner);
    [syncService refreshMembersWithEnterpriseId:enterpriseId LatestSyncTime:latestSyncDate Block:^(BOOL flag){
        dispatch_group_leave(group_inner);
    }];

    dispatch_group_enter(group_inner);
    [syncService refreshReportsWithEnterpriseId:enterpriseId LatestSyncTime:latestSyncDate Block:^(BOOL flag){
        dispatch_group_leave(group_inner);
    }];

    dispatch_group_notify(group_inner, dispatch_get_global_queue(0, 0), ^{
        dispatch_group_leave(group);
    });
}

dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    // 汇总代码
});

写完之后发现,其实在这个场景下,不需要嵌套group,共用一个group也没问题

dispatch_group_t group = dispatch_group_create();

while([rs next]){

    dispatch_group_enter(group);
    [syncService refreshMembersWithEnterpriseId:enterpriseId LatestSyncTime:contactLatestSync Block:^(BOOL flag){
        dispatch_group_leave(group);
    }];

    dispatch_group_enter(group);
    [syncService refreshReportsWithEnterpriseId:enterpriseId LatestSyncTime:reportLatestSync Block:^(BOOL flag){
        dispatch_group_leave(group);
    }];
}

dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    // 汇总代码
});

因为这里并不需要针对每个组做汇总处理,如果每个组还有自己的汇总逻辑需要执行的话,就需要嵌套group了

ios嵌套的异步并行任务场景

时间: 2024-08-21 23:34:49

ios嵌套的异步并行任务场景的相关文章

ios嵌套H5页面,出现的小bug;

ios嵌套H5页面,点击数字时就会弹出打电话的功能:解决方法: 在head标签中添加: <meta name="format-detection" content="telephone=no"> ios嵌套H5页面,只要碰到页面,就会使input获取焦点,调取ios键盘,解决方法:在页面上添加js如下: $("body")[0].addEventListener("touchstart",function(){ d

[Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果

大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3D游戏开发之从<魂斗罗>游戏说起(上)--目标追踪这篇文章后再写一篇<Unity3D游戏开发之从<魂斗罗>游戏说起(下)>,只是眼下博主的项目进度有些缓慢,所以想等项目稳定下来以后再和大家分享. 作为大家等待博主更新博客的回报,我们今天来说一说Unity3D中的游戏场景异步

嵌套的异步回调

今天被一个问题纠结了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){ // 子任务 }]; }); } dis

iOS UITableView中异步加载图片 - 解决方案

问题背景: 需要在UITableView中的每一行下载图片,之前使用placeholder,下载好后存在cache中. 解决方案: 方案一: 使用SDWebImage:https://github.com/rs/SDWebImage 如何安装及使用在git页面有详细解释,具体使用的代码: #import <SDWebImage/UIImageView+WebCache.h> ... - (UITableViewCell *)tableView:(UITableView *)tableView

iOS NSURLConnection和异步网络请求

在日常应用中,我们往往使用AFNetworking等第三方库来实现网络请求部分.这篇文章会简要地介绍一下如何使用NSURLConnection来进行异步的网络请求. 我们先看一个小demo - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSString *urlStr = @"http://www.baidu.c

iOS Sprite Kit教程之场景的切换

iOS Sprite Kit教程之场景的切换 Sprite Kit中切换场景 每一个场景都不是单独存在的.玩家可以从一个场景中切换到另外一个场景中.本小节,我们来讲解场景切换.在每一个游戏中都会使用到场景与场景的切换功能,例如,在街机原始人游戏中,选择关卡这一场景中,可以看到有4关,这四关分别代表了4个场景,如图2.20所示. 图2.20  街机原始的关卡选择 当玩家选择第一关时,就会由选择关卡的场景跳转到第一关的场景中,如图2.21所示. 图2.21  第一关的场景 当玩家选择第二关时,就会由

iOS Sprite Kit教程之场景的设置

iOS Sprite Kit教程之场景的设置 Sprite Kit中设置场景 在图2.8所示的效果中,可以看到新增的场景是没有任何内容的,本节将讲解对场景的三个设置,即颜色的设置.显示模式的设置以及测试信息的设置. Sprite Kit中设置场景的背影颜色 backgroundColor属性可以用来对场景的背影颜色进行设置,其语法形式如下: var backgroundColor: CGColor! UIColor类给开发者提供了一些便利的方法快速制作常见的颜色的名称,而不是使用确定的RGB值.

“全栈2019”Java第八十七章:类中嵌套接口的应用场景(拔高题)

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第八十七章:类中嵌套接口的应用场景(拔高题) 下一章 "全栈2019"Java第八十八章:接口中嵌套接口的应用场景 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"J

“全栈2019”Java第八十八章:接口中嵌套接口的应用场景

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第八十八章:接口中嵌套接口的应用场景 下一章 "全栈2019"Java第八十九章:接口中能定义内部类吗? 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习