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

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

好吧,讲需求了.比如我们在一个页面里头有许多的网络接口.就比如我们拿到数据之后需要刷新一下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

猜你喜欢

转载自blog.csdn.net/qq_18683985/article/details/80696301