iOS-一个页面多个请求完成以后再执行其他操作
来源:互联网 发布:秦丝软件 编辑:程序博客网 时间:2024/05/22 00:14
前言
我们在开发的过程中,大家应该都会遇到已进入某个页面,就要请求多个API,然后我们在完成所有请求以后再进行其他操作,对于这种需求,我们如何来设计我们的代码呢?
例如下面的场景,在发现的页面有6个模块,但是后端给的接口又是分别不同的接口来调用。
实战
我所有的网络请求是基于AFNetworking的封装,然后我给所以的网络请求方法加了一个请求结束的回调,我以头部获取广告数组为例,代码如下:
#pragma mark - 获取广告数组- (void)getAdHotTopDataBaseRequestisScu:(void(^)(BOOL isScu))requestisScu{ WEAKBLOCK; [self.topAddArray removeAllObjects]; NSString *urlStr = @"Ad/fx_top"; [LFNetWorkManager requestDataBaseWithURLByGET:urlStr parameters:nil isWithToken:NO completed:^(id responseObject) { if([responseObject[@"code"] integerValue] == 200){ [ToosZFJ readAndWriteHomeListDataBase:responseObject fileName:[urlStr stringFromMD5] completed:nil];//这个是我写的缓存数据的方法 NSArray *data = responseObject[@"data"]; for (NSDictionary *dict in data) { ADModel *model = [[ADModel alloc]init]; [model setValuesForKeysWithDictionary:dict]; model.mid = dict[@"id"]; if([dict[@"circle"] integerValue] == 1){ //话题 }else{ //头部轮播广告 [weakSelf.topAddArray addObject:model]; } } }else{ [weakSelf SHOWPrompttext:responseObject[@"message"]]; } if(requestisScu){ requestisScu((200 == [responseObject[@"code"] integerValue])?YES:NO); } }];}
备注:200代表请求成功,其他的是请求失败!
其他的网络请求大致如此,加一个回调来通知我请求是否结束,不论失败与否!
然后就是把所以的网络请求放在一个函数里,使用dispatch_group_t来安排请求顺序,代码如下:
#pragma mark - 开始进行请求数据- (void)startAllRequest{ [self showMBProgressHUDLoding:nil]; WEAKBLOCK; dispatch_group_t group = dispatch_group_create(); // 广告数组 dispatch_group_enter(group); [self getAdHotTopDataBaseRequestisScu:^(BOOL isScu) { dispatch_group_leave(group); }]; // 我的关注 dispatch_group_enter(group); [self getDataOfSOurcesFoucesRequestisScu:^(BOOL isScu) { dispatch_group_leave(group); }]; // 推荐比赛 dispatch_group_enter(group); [self getDataSourcesCompareRequestisScu:^(BOOL isScu) { dispatch_group_leave(group); }]; //推荐文章 dispatch_group_enter(group); [self getDataSourcesArticleRequestisScu:^(BOOL isScu) { dispatch_group_leave(group); }]; //推荐老师 dispatch_group_enter(group); [self pageDataAllwithPageRequestisScu:^(BOOL isScu) { dispatch_group_leave(group); }]; //推荐机构 dispatch_group_enter(group); [self dealWithOrganizationDataRequestisScu:^(BOOL isScu) { dispatch_group_leave(group); }]; dispatch_group_notify(group, dispatch_get_main_queue(), ^{ [weakSelf RemoveMBProgressHUDLoding:nil]; [weakSelf.collectionView reloadData]; [weakSelf endRefreshingForTableView:weakSelf.collectionView]; });}
等待所有的网络请求调用dispatch_group_leave以后,就进入dispatch_group_notify,然后我们就可以刷新我们的界面了。
刷新如下:
self.collectionView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ //所以需要请求的数据 [self startAllRequest]; }];
结束语
最近好久没有更新了,迷上了一款小游戏TownShip
阅读全文
0 0
- iOS-一个页面多个请求完成以后再执行其他操作
- CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待
- JAVA多线程—CountDownLatch-一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
- iOS 多个网络请求全部完成后再刷新
- 网页图片预载完成后再执行其他操作
- 页面载入完成后执行多个函数。
- 解决Cordova多页面注册backbutton事件,一个页面响应过事件以后,其他页面不响应的问题
- 两个网络请求完成执行第三个请求
- ios 一个界面多个请求处理
- 一件事由多个线程一起完成后再执行下一步的操作
- iOS - 一个页面多个tableview
- iOS 多个网络请求并发执行的解决方案
- 页面发送请求,浏览器执行哪些操作
- 一个servlet处理来自多个不同页面的请求!
- 加载完成一个页面后自动执行一个方法
- 页面加载完成再执行js代码
- iframe一个页面操作完成后给父页面赋值
- 当页面完全加载完成后执行一个js函数
- 机器学习,深度学习必备数据集
- 零碎知识点
- 【Scikit-Learn 中文文档】八:最近邻
- oracle 全文索引
- Function类型(1)
- iOS-一个页面多个请求完成以后再执行其他操作
- 关于C语言变量内存分配一些自己的理解。
- JS入门之关于冒泡排序
- Baseball Elimination
- Tensorflow C++ 学习(一) 搭建环境
- Git 团队合作基本语句
- 第十讲:重载
- Android6.0运行是权限在某些手机适配问题(小米手机)
- 赵丽颖从农村姑娘翻身成公司老总,投资手段直追赵薇