iOS-一个页面多个请求完成以后再执行其他操作
2017-11-22 16:59
351 查看
前言
我们在开发的过程中,大家应该都会遇到已进入某个页面,就要请求多个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
相关文章推荐
- 整个页面的ajax都执行完以后再进行其他的操作,怎么判断一个图片是否正常显示?
- poj 3308 最小点权覆盖集, 见 胡驳涛论文里面有讲见图方法 二分图最小权点覆盖 我的想法是一个东西通过两个操作都可以完成,这些操作还可以完成其他的东西,每个操作有一个花费,现在要你选出花费最小的操作。这就是裸的模型
- 实现功能:弹出一个DIV层提示等待信息,这个时候禁用用户操作页面中的其他内容
- 使用layer的alert函数完成根据post请求结果弹出一个提示,然后刷新本页面
- iOS中UIWebView的一个需求:获得js图片请求完成的回调时机
- 页面静态化3 --- 使用PHP页面缓存机制来完成页面静态化(下)操作一个案例(新闻管理系统)
- JSP---一个Servlet处理多个请求操作
- IOS-iframe 嵌套某一个页面,点击跳转下一个页面不能操作页面中的任何事件
- iframe一个页面操作完成后给父页面赋值
- 本来从动态壁纸预览页面设置一个动态壁纸回到桌面便可以看到桌面动态壁纸,可以观察得到自己的动态壁纸是否设置成功了(必须知道设置是否成功的结构,因为还有一些操作需要完成)! 但是现在是要在自己的应用中进入
- JAVA多线程—CountDownLatch-一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
- CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
- CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待
- 解决Cordova多页面注册backbutton事件,一个页面响应过事件以后,其他页面不响应的问题
- ios等待ualertview弹出动画完成后再跳转至其他页面
- 如果某个页面上点击按钮发起了一个http url请求,去执行一个action,但是还没等这个action完成,我就刷新了这个页面,然后又点击了这个按钮,这样之前的那次http url请求还在执行吗?
- 继承DispatchAction可在一个Action里完成多个操作
- JavaScript调用App原生代码(iOS、Android)通用解决方案 实际场景 场景:现在有一个H5活动页面,上面有一个登陆按钮,要求点击登陆按钮以后,唤出App内部的登录界面,当登录成功
- iOS 一个页面支持一个方向上横屏,其他页面全部竖屏
- 从 iOS,Objective-C, IPhone, iPad, Android, Java, Node.js 或其他平台,或通过其他开发语言,使用WS-Trust请求一个ADFS的令牌