美文网首页
ios 一个页面多个请求,等所有请求回来才加载页面

ios 一个页面多个请求,等所有请求回来才加载页面

作者: fulen | 来源:发表于2017-09-28 16:08 被阅读384次

1 有时候一个页面有好几个网络请求,而网络请求是异步的,有可能一个请求成功,另一个还在请求,在这个过程中如果刷新UI,可能会造成不好的用户体验以及在导致某些按钮点击无效,下面提供一种方法

创建并发队列,等所有请求结束,刷新UI

_queue = dispatch_queue_create("homeRequest", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t group = dispatch_group_create();

并发队列的特点是
以先进先出的方式,并发调度队列中的任务执行
如果当前调度的任务是同步执行的,会等待任务执行完成后,再调度后续的任务
如果当前调度的任务是异步执行的,同时底层线程池有可用的线程资源,会再新的线程调度后续任务的执行

@interface HomeViewController : BaseViewController
{
     dispatch_queue_t _queue;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self requestUserData:YES pulling:NO];
}

- (void)requestUserData:(BOOL)refresh pulling:(BOOL)pulling {
    if (_queue) {
        return;
    }
    
    BOOL showLoading = NO; // 显示加载框
    
    if (!pulling) {
        if (!数据源1) {
            showLoading = YES;
        }
        
        else if (!数据源2) {
            showLoading = YES;
        }
        else if (!数据源3) {
            showLoading = YES;
        }
    }
    
    if (showLoading) {
        [self showHUDTo:self.view animated:YES];
    }
    
    __weak typeof(self) weakSelf = self;
    _queue = dispatch_queue_create("homeRequest", DISPATCH_QUEUE_CONCURRENT);
    dispatch_group_t group = dispatch_group_create();
    
    if ([JFUserInfoModel isLogin]) {
        dispatch_group_async(group, _queue, ^{
            [weakSelf 网络请求1]; 
        });
        
        dispatch_group_async(group, _queue, ^{
            [weakSelf 网络请求2]; 
        });
    }
    if (refresh || !_homeAdArray) {
        dispatch_group_async(group, _queue, ^{
            [weakSelf 网络请求3];
        });
    }
    
    if (refresh || !_homeFeatureBannerArray) {
        dispatch_group_async(group, _queue, ^{
            [weakSelf 网络请求4];
        });
    }
    
    if (refresh || !_homeProductBannerArray) {
        dispatch_group_async(group, _queue, ^{
            [weakSelf 网络请求5];
        });
    }
    
    if (refresh || !_homeItemArray) {
        dispatch_group_async(group, _queue, ^{
            [weakSelf 网络请求6];
        });
    }
    if (refresh) {
        // 下拉刷新时
       // do something
    }
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        [weakSelf reload:showLoading pulling:pulling];
    });
}
- (void)reload:(BOOL)showLoading pulling:(BOOL)pulling {
    _queue = nil;
    if (pulling) {
        [_tableView.mj_header endRefreshing];
    }
    else if (showLoading){
        [self hideHUDView:self.view animated:YES]; // 隐藏loading框
    }
    [self setupVenderView];
    [_tableView reloadData];
}

// 网络请求1
- (void) request网络请求1 {
    __block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
    Request *request = [[Request alloc] init];
    [self post:request forResponseClass:[Response class] onSuccess:^(Response *response) {
        if ([response success]) {
            _integral = ((Response *)response).data;
        }
        dispatch_semaphore_signal(sem);
    } onFailure:^(NSError *error) {
        dispatch_semaphore_signal(sem);
    }];
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
}

//  网络请求2
- (void) request网络请求2 {
    __block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
    [self post:request forResponseClass:[indingResponse class] onSuccess:^(Response *response) {
        if ([response success]) {
               [self setupVenderDataWithData:response];
            }
        dispatch_semaphore_signal(sem);
    } onFailure:^(NSError *error) {
        dispatch_semaphore_signal(sem);
    }];
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
}


相关文章

  • ios 一个页面多个请求,等所有请求回来才加载页面

    1 有时候一个页面有好几个网络请求,而网络请求是异步的,有可能一个请求成功,另一个还在请求,在这个过程中如果刷新U...

  • iOS分组并发网络请求

    需求1:有多个网络请求,要求所有网络请求全部完成后,进行页面刷新等操作需求2:有多个网络请求,且要求网络请求顺序依...

  • 移动端性能优化(1)

    网络加载类首屏数据请求提前,避免JavaScript文件加载后才请求数据为了进一步提升页面加载速度,可以考虑将页面...

  • 页面优化

    一、加载优化 1、减少Http请求 页面中的图片、css、js文件等,每加载一个这样的文件都需要发送Http请求,...

  • 性能优化

    提升页面加载速度 减少网络请求 将请求过的数据存储到本地 redux、内存、sessionStorage等 通过函...

  • 使用Dispatch Groups来管理多个请求

    项目中加载某个页面需要调用多个接口,我们希望多个请求回来后一起展示;这个时候就可以使用Dispatch Group...

  • 页面跳转再返回时原有页面数据的保存问题

    场景:一个页面如果通过ajax请求加载数据时,如果跳转到下一页面再回来,这时候数据会消失,需要再次通过ajax请求...

  • 浅谈前端性能优化-移动端(转载)

    网络加载类 首屏数据请求提前,避免JavaScript文件加载后才请求渲染为了进一步提示页面加载速度,可以考虑将页...

  • 移动端性能优化(1)

    网络加载类 首屏数据请求提前,避免JavaScript文件加载后才请求数据 为了进一步提升页面加载速度,可以考虑将...

  • IOS 学习笔记--单个页面多次请求-排队处理

    业务需求:一个页面加载2次请求,保证两次请求完成后,在页面加载数据。 参考:主要参考方法 注意: 是为了在主线程进...

网友评论

      本文标题:ios 一个页面多个请求,等所有请求回来才加载页面

      本文链接:https://www.haomeiwen.com/subject/wwfvextx.html