请求多个数据直到完成统一刷新

标题真不知道怎么写比较好…

好吧,讲需求了.比如我们在一个页面里头有许多的网络接口.就比如我们拿到数据之后需要刷新一下UITableView.那么如果我们在每个网路请求回调的里头的返回里头reloadData.那么有多少的接口就会reload多少次.这样感觉性能消耗比较大.

有一种写起来比较方便快捷的就是dispatch_group.

///1.首先创建一个dispatch_group_t
dispatch_group_t group = dispatch_group_create();
///2.需要加载的请求的方法都加上group参数
- (void)request1:(dispatch_group_t)group {
    //xxx
}
///3.发起网络请求之前进入group中
- (void)request1:(dispatch_group_t)group {
    //请求之前进入group中
    dispatch_group_enter(group);
    [sessionManager requestxxx {

    }];
}
///4.全部请求完成之后在dispatch_group_notify中做数据刷新
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
///刷新数据
});

以下是使用例子

//
//  ViewController.m
//  模拟多接口请求之后一次刷新
//
//  Created by 张晨晖 on 2018/6/11.
//  Copyright © 2018年 张晨晖. All rights reserved.
//

#import "ViewController.h"
#import <AFNetworking.h>
#import <MBProgressHUD.h>

@interface ViewController ()

@property (nonatomic ,strong) MBProgressHUD *progressHUD;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    //https://raw.githubusercontent.com/MeteoriteMan/JSONTest/master/JSONTest?raw=true
    self.progressHUD = [MBProgressHUD showHUDAddedTo:self.view animated:NO];
    self.progressHUD.label.text = @"正在加载数据";
    [self.progressHUD showAnimated:YES];

    dispatch_group_t group = dispatch_group_create();

    [self request1:group];
    [self request2:group];
    [self request3:group];
    [self request4:group];

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"请求完成");
        self.progressHUD.label.text = @"加载完成";
        [self.progressHUD hideAnimated:YES afterDelay:2];
    });

}

- (void)request1:(dispatch_group_t)group {
    dispatch_group_enter(group);
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"]; // 设置content-Type为text/html 或 application/json
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    [manager GET:@"https://raw.githubusercontent.com/MeteoriteMan/JSONTest/master/JSONTest.json" parameters:@{} progress:^(NSProgress * _Nonnull downloadProgress) {
        NSLog(@"1:%@",downloadProgress);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"1:%@",responseObject);
        dispatch_group_leave(group);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"1:%@",error);
        dispatch_group_leave(group);
    }];
}

- (void)request2:(dispatch_group_t)group {
    dispatch_group_enter(group);
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"]; // 设置content-Type为text/html 或 application/json
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    [manager GET:@"https://raw.githubusercontent.com/MeteoriteMan/JSONTest/master/JSONTest.json" parameters:@{} progress:^(NSProgress * _Nonnull downloadProgress) {
        NSLog(@"2:%@",downloadProgress);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"2:%@",responseObject);
        dispatch_group_leave(group);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"2:%@",error);
        dispatch_group_leave(group);
    }];
}

- (void)request3:(dispatch_group_t)group {
    dispatch_group_enter(group);
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"]; // 设置content-Type为text/html 或 application/json
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    [manager GET:@"https://raw.githubusercontent.com/MeteoriteMan/JSONTest/master/JSONTest.json" parameters:@{} progress:^(NSProgress * _Nonnull downloadProgress) {
        NSLog(@"3:%@",downloadProgress);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"3:%@",responseObject);
        dispatch_group_leave(group);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"3:%@",error);
        dispatch_group_leave(group);
    }];
}

- (void)request4:(dispatch_group_t)group {
    dispatch_group_enter(group);
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"]; // 设置content-Type为text/html 或 application/json
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    [manager GET:@"https://raw.githubusercontent.com/MeteoriteMan/JSONTest/master/JSONTest.json" parameters:@{} progress:^(NSProgress * _Nonnull downloadProgress) {
        NSLog(@"4:%@",downloadProgress);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"4:%@",responseObject);
        dispatch_group_leave(group);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"4:%@",error);
        dispatch_group_leave(group);
    }];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用jQuery的Deferred对象和when()方法来实现多个请求合并到一个数据里面。 首先,我们可以使用jQuery的$.ajax()方法发送多个请求,每个请求都返回一个Deferred对象,表示请求的异步操作。 然后,我们可以使用$.when()方法来等待所有的异步操作都完成。$.when()方法接受多个Deferred对象作为参数,当所有Deferred对象都执行完成时,它返回一个新的Deferred对象。 最后,我们可以在$.when()方法的回调函数中,获取每个请求的返回数据,再将它们合并到一个数据里面。 以下是一个示例代码: ```javascript var deferred1 = $.ajax({ url: 'url1', dataType: 'json' }); var deferred2 = $.ajax({ url: 'url2', dataType: 'json' }); var deferred3 = $.ajax({ url: 'url3', dataType: 'json' }); $.when(deferred1, deferred2, deferred3).done(function(result1, result2, result3) { // 将三个请求的返回数据合并到一个数据里面 var data = $.extend({}, result1[0], result2[0], result3[0]); console.log(data); }); ``` 在上面的代码中,我们发送了三个请求,分别是'url1'、'url2'和'url3',每个请求返回一个Deferred对象。 然后,我们使用$.when()方法等待三个请求完成,当它们都完成时,执行回调函数。在回调函数中,我们使用$.extend()方法将三个请求的返回数据合并到一个数据里面,并输出到控制台上。 注意,使用$.when()方法等待多个异步操作时,它们的执行顺序是不确定的。因此,在合并返回数据时,需要注意返回数据的格式和字段名称是否一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值