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