场景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异步 异步下载图片 线程小demo
iOS POST GET 同步 异步 网络请求。
iOS开发中经常会要求展示网络图片, 这个代码实现的是UIImageView和UIButton的类别类, 用来异步展示网络图片, 同时提供了一个 get_http_data函数,用来异步下载网络数据。 简单介绍请看下面的BLOG连接。 ...
ios tableview 异步 加载图片
嵌套滚动解决方式 导航栏隐藏,仅作参考
ios8及以上
iOS 图片异步加载 图片缓存
[Mac.OS.X和iOS中的并行开发].源代码.rar
这是一个异步加载 图片缓存管理的小例子 简化对网络图片加载的处理
随着业务的发展,页面的复杂度越来越高,嵌套滚动视图的方式也越来越受设计师们的青睐,在各大电商App十分常见。如下Demo图: 但是这样的交互官方并不推荐,而且对开发来说确是不那么友好,需要处理滚动手势的冲突,...
http://blog.csdn.net/duxinfeng2010/article/details/9000693 详细介绍
ios iphone异步加载图片EGOTableViewPullRefresh 非常好用 可以加快网络图片加载的速度,必不可少
一个iOS异步加载网络图片的Demo,用Objective-C写的,包含了三种加载网络图片的方式:同步、异步和Cache异步。界面布局全部代码手写,使用的是TableView布局。代码有注释,很简洁。欢迎大家下载使用。
1、UIScrollView 嵌套 UITableView 2、UITableView 嵌套 UITableView 3、UITableView 嵌套 子视图控制器 UIViewController
This concise book shows you how to use Apple's Grand Central Dispatch (GCD) to simplify programming on multicore iOS devices and Mac OS X. Managing your application’s resources on more than one ...
iOS异步图片加载库..zip,远程图像,简单到一,二,三。
在开发中经常会遇到列表加载的功能,其中大部分都包括图片列表加载,但移动设备本身内存有限,而大量图片加载又很耗内存。今天主要就介绍一个第三方图片异步加载库SDWebImage
ios同步、异步、get与post请求的简单介绍
ASI封装的多线程队列下载 可以同时进行多个任务
异步实现下载网络图片,回到主线程中加载图片并且显示到imageView中去,实现内存中的缓存,对于物理磁盘的缓存我没有做,觉得现在APP基本没必要把图片下载到本地物理内存中去。写的不好,大家勿喷!