&e@Y*tKcg?xSLmzsHTpXJ4Sj?DmcB{frSH){
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
+
+
+
+
+
+
+
+
diff --git a/PPNetworkHelper.xcodeproj/xcuserdata/GSTB.xcuserdatad/xcschemes/xcschememanagement.plist b/PPNetworkHelper.xcodeproj/xcuserdata/GSTB.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 0000000..26c958b
--- /dev/null
+++ b/PPNetworkHelper.xcodeproj/xcuserdata/GSTB.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,14 @@
+
+
+
+
+ SchemeUserState
+
+ PPNetworkHelper.xcscheme
+
+ orderHint
+ 0
+
+
+
+
diff --git a/PPNetworkHelper/PPHTTPRequest.m b/PPNetworkHelper/PPHTTPRequest.m
index 9de2821..f9198a6 100644
--- a/PPNetworkHelper/PPHTTPRequest.m
+++ b/PPNetworkHelper/PPHTTPRequest.m
@@ -15,7 +15,7 @@ @implementation PPHTTPRequest
+ (NSURLSessionTask *)getLoginWithParameters:(id)parameters success:(PPRequestSuccess)success failure:(PPRequestFailure)failure
{
// 将请求前缀与请求路径拼接成一个完整的URL
- NSString *url = [NSString stringWithFormat:@"%@%@",kApiPrefix,kLogin];
+ NSString *url = [NSString stringWithFormat:@"%@%@",kApiPrefix,KLogin];
return [self requestWithURL:url parameters:parameters success:success failure:failure];
}
/** 退出*/
@@ -38,11 +38,9 @@ + (NSURLSessionTask *)requestWithURL:(NSString *)URL parameters:(NSDictionary *)
{
// 在请求之前你可以统一配置你请求的相关参数 ,设置请求头, 请求参数的格式, 返回数据的格式....这样你就不需要每次请求都要设置一遍相关参数
// 设置请求头
- [PPNetworkHelper setValue:@"9" forHTTPHeaderField:@"fromType"];
-
+ [PPNetworkHelper setValue:@"v1.0.0" forHTTPHeaderField:@"api-version"];
// 发起请求
- return [PPNetworkHelper POST:URL parameters:parameter success:^(id responseObject) {
-
+ return [[PPNetworkHelper shareTools] request:POST URLString:URL parameters:parameter success:^(id responseObject) {
// 在这里你可以根据项目自定义其他一些重复操作,比如加载页面时候的等待效果, 提醒弹窗....
success(responseObject);
@@ -50,6 +48,7 @@ + (NSURLSessionTask *)requestWithURL:(NSString *)URL parameters:(NSDictionary *)
// 同上
failure(error);
}];
+
}
@end
diff --git a/PPNetworkHelper/PPInterfacedConst.h b/PPNetworkHelper/PPInterfacedConst.h
index 1b1d16f..b22c57b 100644
--- a/PPNetworkHelper/PPInterfacedConst.h
+++ b/PPNetworkHelper/PPInterfacedConst.h
@@ -20,25 +20,25 @@
#ifndef PPInterfacedConst_h
#define PPInterfacedConst_h
-#define DevelopSever 0
-#define TestSever 1
+#define DevelopSever 1
+#define TestSever 0
#define ProductSever 0
#if DevelopSever
/** 接口前缀-开发服务器*/
-NSString *const kApiPrefix = @"接口服务器的请求前缀 例: http://192.168.10.10:8080";
+NSString *const kApiPrefix = @"";
#elif TestSever
/** 接口前缀-测试服务器*/
-NSString *const kApiPrefix = @"https://www.baidu.com";
+NSString *const kApiPrefix = @"";
#elif ProductSever
/** 接口前缀-生产服务器*/
-NSString *const kApiPrefix = @"https://www.baidu.com";
+NSString *const kApiPrefix = @"";
#endif
#pragma mark - 详细接口地址
/** 登录*/
-NSString *const kLogin = @"/login";
+NSString *const KLogin = @"";
/** 平台会员退出*/
NSString *const kExit = @"/exit";
diff --git a/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.h b/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.h
index 5e91078..8baddfe 100755
--- a/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.h
+++ b/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.h
@@ -34,7 +34,7 @@
#import
#import
#import "PPNetworkCache.h"
-
+#import "AFNetworking.h"
#ifndef kIsNetwork
#define kIsNetwork [PPNetworkHelper isNetwork] // 一次性判断是否有网的宏
#endif
@@ -46,6 +46,15 @@
#ifndef kIsWiFiNetwork
#define kIsWiFiNetwork [PPNetworkHelper isWiFiNetwork] // 一次性判断是否为WiFi网络的宏
#endif
+//请求方式
+typedef enum: NSInteger{
+ GET,//GET请求
+ POST,
+ DELETE,
+ HEAD,
+ PATCH,
+ PUT,
+}PPRequestMethod;
typedef NS_ENUM(NSUInteger, PPNetworkStatusType) {
/** 未知网络*/
@@ -87,9 +96,14 @@ typedef void (^PPHttpProgress)(NSProgress *progress);
/** 网络状态的Block*/
typedef void(^PPNetworkStatus)(PPNetworkStatusType status);
-@class AFHTTPSessionManager;
-@interface PPNetworkHelper : NSObject
+@interface PPNetworkHelper : AFHTTPSessionManager
+/**
+ * 所有的HTTP请求共享一个AFHTTPSessionManager
+ * 原理参考地址:http://www.jianshu.com/p/5969bbb4af9f
+ */
+
++(instancetype)shareTools;
/**
有网YES, 无网:NO
*/
@@ -105,21 +119,12 @@ typedef void(^PPNetworkStatus)(PPNetworkStatusType status);
*/
+ (BOOL)isWiFiNetwork;
-/**
- 取消所有HTTP请求
- */
-+ (void)cancelAllRequest;
/**
实时获取网络状态,通过Block回调实时获取(此方法可多次调用)
*/
+ (void)networkStatusWithBlock:(PPNetworkStatus)networkStatus;
-/**
- 取消指定URL的HTTP请求
- */
-+ (void)cancelRequestWithURL:(NSString *)URL;
-
/**
开启日志打印 (Debug级别)
*/
@@ -132,68 +137,46 @@ typedef void(^PPNetworkStatus)(PPNetworkStatusType status);
/**
- * GET请求,无缓存
- *
- * @param URL 请求地址
- * @param parameters 请求参数
- * @param success 请求成功的回调
- * @param failure 请求失败的回调
- *
- * @return 返回的对象可取消请求,调用cancel方法
+ 取消所有HTTP请求
*/
-+ (__kindof NSURLSessionTask *)GET:(NSString *)URL
- parameters:(id)parameters
- success:(PPHttpRequestSuccess)success
- failure:(PPHttpRequestFailed)failure;
+- (void)cancelAllRequest;
/**
- * GET请求,自动缓存
- *
- * @param URL 请求地址
- * @param parameters 请求参数
- * @param responseCache 缓存数据的回调
- * @param success 请求成功的回调
- * @param failure 请求失败的回调
- *
- * @return 返回的对象可取消请求,调用cancel方法
+ 取消指定URL的HTTP请求
*/
-+ (__kindof NSURLSessionTask *)GET:(NSString *)URL
- parameters:(id)parameters
- responseCache:(PPHttpRequestCache)responseCache
- success:(PPHttpRequestSuccess)success
- failure:(PPHttpRequestFailed)failure;
+- (void)cancelRequestWithURL:(NSString *)URL;
+
/**
- * POST请求,无缓存
- *
- * @param URL 请求地址
- * @param parameters 请求参数
- * @param success 请求成功的回调
- * @param failure 请求失败的回调
- *
- * @return 返回的对象可取消请求,调用cancel方法
+ 网络请求,有缓存
+
+ @param method 请求方式 GET/POST(可根据枚举自行选择多种请求方式)
+ @param URLString 请求地址
+ @param parameters 请求参数
+ @param responseCache 缓存数据的回调
+ @param success 请求成功的回调
+ @param failure 请求失败的回调
+ @return 返回的对象可取消请求,调用cancel方法
*/
-+ (__kindof NSURLSessionTask *)POST:(NSString *)URL
- parameters:(id)parameters
- success:(PPHttpRequestSuccess)success
- failure:(PPHttpRequestFailed)failure;
+-(NSURLSessionTask *)request:(PPRequestMethod)method URLString:(NSString *)URLString parameters:(id)parameters
+ responseCache:(PPHttpRequestCache)responseCache
+ success:(PPHttpRequestSuccess)success
+ failure:(PPHttpRequestFailed)failure;
+
/**
- * POST请求,自动缓存
- *
- * @param URL 请求地址
- * @param parameters 请求参数
- * @param responseCache 缓存数据的回调
- * @param success 请求成功的回调
- * @param failure 请求失败的回调
- *
- * @return 返回的对象可取消请求,调用cancel方法
+ 网络请求,无缓存
+
+ @param method 请求方式 GET/POST(可根据枚举自行选择多种请求方式)
+ @param URLString 请求地址
+ @param parameters 请求参数
+ @param success 请求成功的回调
+ @param failure 请求失败的回调
+ @return 返回的对象可取消请求,调用cancel方法
*/
-+ (__kindof NSURLSessionTask *)POST:(NSString *)URL
- parameters:(id)parameters
- responseCache:(PPHttpRequestCache)responseCache
- success:(PPHttpRequestSuccess)success
- failure:(PPHttpRequestFailed)failure;
+-(NSURLSessionTask *)request:(PPRequestMethod)method URLString:(NSString *)URLString parameters:(id)parameters
+ success:(PPHttpRequestSuccess)success
+ failure:(PPHttpRequestFailed)failure;
/**
* 上传文件
@@ -208,7 +191,7 @@ typedef void(^PPNetworkStatus)(PPNetworkStatusType status);
*
* @return 返回的对象可取消请求,调用cancel方法
*/
-+ (__kindof NSURLSessionTask *)uploadFileWithURL:(NSString *)URL
+- (__kindof NSURLSessionTask *)uploadFileWithURL:(NSString *)URL
parameters:(id)parameters
name:(NSString *)name
filePath:(NSString *)filePath
@@ -232,7 +215,7 @@ typedef void(^PPNetworkStatus)(PPNetworkStatusType status);
*
* @return 返回的对象可取消请求,调用cancel方法
*/
-+ (__kindof NSURLSessionTask *)uploadImagesWithURL:(NSString *)URL
+- (__kindof NSURLSessionTask *)uploadImagesWithURL:(NSString *)URL
parameters:(id)parameters
name:(NSString *)name
images:(NSArray *)images
@@ -254,7 +237,7 @@ typedef void(^PPNetworkStatus)(PPNetworkStatusType status);
*
* @return 返回NSURLSessionDownloadTask实例,可用于暂停继续,暂停调用suspend方法,开始下载调用resume方法
*/
-+ (__kindof NSURLSessionTask *)downloadWithURL:(NSString *)URL
+- (__kindof NSURLSessionTask *)downloadWithURL:(NSString *)URL
fileDir:(NSString *)fileDir
progress:(PPHttpProgress)progress
success:(void(^)(NSString *filePath))success
diff --git a/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.m b/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.m
index 9f74523..af19c15 100755
--- a/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.m
+++ b/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.m
@@ -18,12 +18,44 @@
#endif
#define NSStringFormat(format,...) [NSString stringWithFormat:format,##__VA_ARGS__]
+//网络工具协议
+@protocol NetworkToolsProxy
+@optional
+- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method
+ URLString:(NSString *)URLString
+ parameters:(id)parameters
+ uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress
+ downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgress
+ success:(void (^)(NSURLSessionDataTask *, id))success
+ failure:(void (^)(NSURLSessionDataTask *, NSError *))failure;
+@end
+
+@interface PPNetworkHelper()
+
+@end
@implementation PPNetworkHelper
static BOOL _isOpenLog; // 是否已开启日志打印
static NSMutableArray *_allSessionTask;
-static AFHTTPSessionManager *_sessionManager;
+static PPNetworkHelper*_sessionManager = nil;
++(instancetype)shareTools{
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ _sessionManager = [[PPNetworkHelper alloc] init];
+ // 设置请求的超时时间
+ _sessionManager.requestSerializer.timeoutInterval = 30.f;
+ // 设置服务器返回结果的类型:JSON (AFJSONResponseSerializer,AFHTTPResponseSerializer)
+ _sessionManager.responseSerializer = [AFJSONResponseSerializer serializer];
+ _sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html", @"text/json", @"text/plain", @"text/javascript", @"text/xml", @"image/*", nil];
+ // 打开状态栏的等待菊花
+ [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
+ });
+
+ return _sessionManager;
+}
+
+
#pragma mark - 开始监听网络
+ (void)networkStatusWithBlock:(PPNetworkStatus)networkStatus {
@@ -73,7 +105,7 @@ + (void)closeLog {
_isOpenLog = NO;
}
-+ (void)cancelAllRequest {
+- (void)cancelAllRequest {
// 锁操作
@synchronized(self) {
[[self allSessionTask] enumerateObjectsUsingBlock:^(NSURLSessionTask *_Nonnull task, NSUInteger idx, BOOL * _Nonnull stop) {
@@ -83,7 +115,7 @@ + (void)cancelAllRequest {
}
}
-+ (void)cancelRequestWithURL:(NSString *)URL {
+- (void)cancelRequestWithURL:(NSString *)URL {
if (!URL) { return; }
@synchronized (self) {
[[self allSessionTask] enumerateObjectsUsingBlock:^(NSURLSessionTask *_Nonnull task, NSUInteger idx, BOOL * _Nonnull stop) {
@@ -96,88 +128,68 @@ + (void)cancelRequestWithURL:(NSString *)URL {
}
}
-#pragma mark - GET请求无缓存
-+ (NSURLSessionTask *)GET:(NSString *)URL
- parameters:(id)parameters
- success:(PPHttpRequestSuccess)success
- failure:(PPHttpRequestFailed)failure {
- return [self GET:URL parameters:parameters responseCache:nil success:success failure:failure];
-}
-
-#pragma mark - POST请求无缓存
-+ (NSURLSessionTask *)POST:(NSString *)URL
- parameters:(id)parameters
- success:(PPHttpRequestSuccess)success
- failure:(PPHttpRequestFailed)failure {
- return [self POST:URL parameters:parameters responseCache:nil success:success failure:failure];
+-(NSURLSessionTask *)request:(PPRequestMethod)method URLString:(NSString *)URLString parameters:(id)parameters
+ success:(PPHttpRequestSuccess)success
+ failure:(PPHttpRequestFailed)failure{
+ return [self request:method URLString:URLString parameters:(id)parameters responseCache:nil success:success failure:failure];
}
-#pragma mark - GET请求自动缓存
-+ (NSURLSessionTask *)GET:(NSString *)URL
- parameters:(id)parameters
- responseCache:(PPHttpRequestCache)responseCache
- success:(PPHttpRequestSuccess)success
- failure:(PPHttpRequestFailed)failure {
- //读取缓存
- responseCache!=nil ? responseCache([PPNetworkCache httpCacheForURL:URL parameters:parameters]) : nil;
+-(NSURLSessionTask *)request:(PPRequestMethod)method URLString:(NSString *)URLString parameters:(id)parameters
+ responseCache:(PPHttpRequestCache)responseCache
+ success:(PPHttpRequestSuccess)success
+ failure:(PPHttpRequestFailed)failure{
- NSURLSessionTask *sessionTask = [_sessionManager GET:URL parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
-
- } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
-
- if (_isOpenLog) {PPLog(@"responseObject = %@",[self jsonToString:responseObject]);}
- [[self allSessionTask] removeObject:task];
- success ? success(responseObject) : nil;
- //对数据进行异步缓存
- responseCache!=nil ? [PPNetworkCache setHttpCache:responseObject URL:URL parameters:parameters] : nil;
-
- } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
-
- if (_isOpenLog) {PPLog(@"error = %@",error);}
- [[self allSessionTask] removeObject:task];
- failure ? failure(error) : nil;
-
- }];
- // 添加sessionTask到数组
- sessionTask ? [[self allSessionTask] addObject:sessionTask] : nil ;
+ NSString *methodString = @"";
+ switch (method) {
+ case GET:
+ methodString = @"GET";
+ break;
+ case POST:
+ methodString = @"POST";
+ break;
+ case DELETE:
+ methodString = @"DELETE";
+ break;
+ case HEAD:
+ methodString = @"HEAD";
+ break;
+ case PUT:
+ methodString = @"PUT";
+ break;
+ case PATCH:
+ methodString = @"PATCH";
+ break;
+ default:
+ break;
+ }
- return sessionTask;
-}
-
-#pragma mark - POST请求自动缓存
-+ (NSURLSessionTask *)POST:(NSString *)URL
- parameters:(id)parameters
- responseCache:(PPHttpRequestCache)responseCache
- success:(PPHttpRequestSuccess)success
- failure:(PPHttpRequestFailed)failure {
//读取缓存
- responseCache!=nil ? responseCache([PPNetworkCache httpCacheForURL:URL parameters:parameters]) : nil;
-
- NSURLSessionTask *sessionTask = [_sessionManager POST:URL parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
-
- } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
-
+ responseCache!=nil ? responseCache([PPNetworkCache httpCacheForURL:URLString parameters:parameters]) : nil;
+
+ NSURLSessionTask *sessionTask = [self dataTaskWithHTTPMethod:methodString URLString:URLString parameters:parameters uploadProgress:nil downloadProgress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
+
if (_isOpenLog) {PPLog(@"responseObject = %@",[self jsonToString:responseObject]);}
[[self allSessionTask] removeObject:task];
success ? success(responseObject) : nil;
//对数据进行异步缓存
- responseCache!=nil ? [PPNetworkCache setHttpCache:responseObject URL:URL parameters:parameters] : nil;
+ responseCache!=nil ? [PPNetworkCache setHttpCache:responseObject URL:URLString parameters:parameters] : nil;
- } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
+ } failure:^(NSURLSessionDataTask *task, NSError *error) {
if (_isOpenLog) {PPLog(@"error = %@",error);}
[[self allSessionTask] removeObject:task];
failure ? failure(error) : nil;
}];
+ [sessionTask resume];
+ // 添加sessionTask到数组
+ sessionTask ? [[self allSessionTask] addObject:sessionTask] : nil;
- // 添加最新的sessionTask到数组
- sessionTask ? [[self allSessionTask] addObject:sessionTask] : nil ;
return sessionTask;
}
#pragma mark - 上传文件
-+ (NSURLSessionTask *)uploadFileWithURL:(NSString *)URL
+- (NSURLSessionTask *)uploadFileWithURL:(NSString *)URL
parameters:(id)parameters
name:(NSString *)name
filePath:(NSString *)filePath
@@ -187,7 +199,7 @@ + (NSURLSessionTask *)uploadFileWithURL:(NSString *)URL
NSURLSessionTask *sessionTask = [_sessionManager POST:URL parameters:parameters constructingBodyWithBlock:^(id _Nonnull formData) {
NSError *error = nil;
- [formData appendPartWithFileURL:[NSURL URLWithString:filePath] name:name error:&error];
+ [formData appendPartWithFileURL:[NSURL fileURLWithPath:filePath] name:name error:&error];
(failure && error) ? failure(error) : nil;
} progress:^(NSProgress * _Nonnull uploadProgress) {
//上传进度
@@ -214,7 +226,7 @@ + (NSURLSessionTask *)uploadFileWithURL:(NSString *)URL
}
#pragma mark - 上传多张图片
-+ (NSURLSessionTask *)uploadImagesWithURL:(NSString *)URL
+- (NSURLSessionTask *)uploadImagesWithURL:(NSString *)URL
parameters:(id)parameters
name:(NSString *)name
images:(NSArray *)images
@@ -267,7 +279,7 @@ + (NSURLSessionTask *)uploadImagesWithURL:(NSString *)URL
}
#pragma mark - 下载文件
-+ (NSURLSessionTask *)downloadWithURL:(NSString *)URL
+- (NSURLSessionTask *)downloadWithURL:(NSString *)URL
fileDir:(NSString *)fileDir
progress:(PPHttpProgress)progress
success:(void(^)(NSString *))success
@@ -308,7 +320,7 @@ + (NSURLSessionTask *)downloadWithURL:(NSString *)URL
/**
* json转字符串
*/
-+ (NSString *)jsonToString:(id)data {
+- (NSString *)jsonToString:(id)data {
if(data == nil) { return nil; }
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data options:NSJSONWritingPrettyPrinted error:nil];
return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
@@ -317,7 +329,7 @@ + (NSString *)jsonToString:(id)data {
/**
存储着所有的请求task数组
*/
-+ (NSMutableArray *)allSessionTask {
+- (NSMutableArray *)allSessionTask {
if (!_allSessionTask) {
_allSessionTask = [[NSMutableArray alloc] init];
}
@@ -331,20 +343,11 @@ + (NSMutableArray *)allSessionTask {
+ (void)load {
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
}
-/**
- * 所有的HTTP请求共享一个AFHTTPSessionManager
- * 原理参考地址:http://www.jianshu.com/p/5969bbb4af9f
- */
-+ (void)initialize {
- _sessionManager = [AFHTTPSessionManager manager];
- // 设置请求的超时时间
- _sessionManager.requestSerializer.timeoutInterval = 30.f;
- // 设置服务器返回结果的类型:JSON (AFJSONResponseSerializer,AFHTTPResponseSerializer)
- _sessionManager.responseSerializer = [AFJSONResponseSerializer serializer];
- _sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html", @"text/json", @"text/plain", @"text/javascript", @"text/xml", @"image/*", nil];
- // 打开状态栏的等待菊花
- [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
-}
+
+//+ (void)initialize {
+// _sessionManager = [AFHTTPSessionManager manager];
+//
+//}
#pragma mark - 重置AFHTTPSessionManager相关属性
diff --git a/PPNetworkHelper/ViewController.m b/PPNetworkHelper/ViewController.m
index 80e41b0..2932bef 100755
--- a/PPNetworkHelper/ViewController.m
+++ b/PPNetworkHelper/ViewController.m
@@ -118,18 +118,18 @@ - (void)viewDidLoad {
- (void)PPHTTPRequestLayerDemo
{
// 登陆
- [PPHTTPRequest getLoginWithParameters:@"参数" success:^(id response) {
+ [PPHTTPRequest getLoginWithParameters:@{} success:^(id response) {
} failure:^(NSError *error) {
}];
- // 退出
- [PPHTTPRequest getExitWithParameters:@"参数" success:^(id response) {
-
- } failure:^(NSError *error) {
-
- }];
+// // 退出
+// [PPHTTPRequest getExitWithParameters:@"参数" success:^(id response) {
+//
+// } failure:^(NSError *error) {
+//
+// }];
}
@@ -144,7 +144,7 @@ - (void)getData:(BOOL)isOn url:(NSString *)url
{
self.cacheStatus.text = @"缓存打开";
self.cacheSwitch.on = YES;
- [PPNetworkHelper GET:url parameters:para responseCache:^(id responseCache) {
+ [[PPNetworkHelper shareTools] request:GET URLString:url parameters:para responseCache:^(id responseCache) {
// 1.先加载缓存数据
self.cacheData.text = [self jsonToString:responseCache];
} success:^(id responseObject) {
@@ -162,12 +162,14 @@ - (void)getData:(BOOL)isOn url:(NSString *)url
self.cacheSwitch.on = NO;
self.cacheData.text = @"";
- [PPNetworkHelper GET:url parameters:para success:^(id responseObject) {
+ [[PPNetworkHelper shareTools] request:GET URLString:url parameters:para success:^(id responseObject) {
+ // 2.再请求网络数据
self.networkData.text = [self jsonToString:responseObject];
} failure:^(NSError *error) {
}];
+
}
}
@@ -236,7 +238,7 @@ - (IBAction)download:(UIButton *)sender {
self.download = YES;
[self.downloadBtn setTitle:@"取消下载" forState:UIControlStateNormal];
- task = [PPNetworkHelper downloadWithURL:downloadUrl fileDir:@"Download" progress:^(NSProgress *progress) {
+ task = [[PPNetworkHelper shareTools] downloadWithURL:downloadUrl fileDir:@"Download" progress:^(NSProgress *progress) {
CGFloat stauts = 100.f * progress.completedUnitCount/progress.totalUnitCount;
self.progress.progress = stauts/100.f;
From 2b0c100beef77e1aa8a6e011c61790da61ccc19c Mon Sep 17 00:00:00 2001
From: mishan <903607388@qq.com>
Date: Sun, 30 Sep 2018 11:06:11 +0800
Subject: [PATCH 2/5] no message
---
.../UserInterfaceState.xcuserstate | Bin 31774 -> 32954 bytes
.../PPNetworkHelper/PPNetworkHelper.m | 4 ++--
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/PPNetworkHelper.xcodeproj/project.xcworkspace/xcuserdata/GSTB.xcuserdatad/UserInterfaceState.xcuserstate b/PPNetworkHelper.xcodeproj/project.xcworkspace/xcuserdata/GSTB.xcuserdatad/UserInterfaceState.xcuserstate
index 75ad11527a8448d8087f3f451ccefa227259e994..3f5f3d35dcf0fadd12081aa9f97a710931fefb3c 100644
GIT binary patch
delta 14808
zcmaKS2V9fK|NnFMER>amnJ@wgVTZjpA?&c@9+VN45{7`d&7E3z9gViGs^FmRS*zB)
zSKV4iwT@bCYpb?
z+D#p$j#0;{6V$f`>N0hOx<%cl?o$t_U#Z`yKdFBJ1vtP12jB>tfHM#SDewT^zy~Nn
z5C{g5AQohU9FPk%AP?k&0?-fi2c_TxPzK7uKrjeYff_Ivj0B^=I4~JZ0aL*YU<9+l
zT(A&)4iR5rR)98O*a!B51K=Py1P+5E;3zl-j)N26BsdMufb-xYxDIZB@4;R0
z3-}BC4W2*%A*7)-w1JM$2|B|d7z{&TC=7$)Fak!xC>RYBVG>lsbXWijVG%5b-Qgfu
z1wVwQTnpF1
zO>isR0l$X(;C^@*9)U;UDR>rMgqPrLcnAIf@4_G9WB3RB6aEGNhR@(DnxZ+{l6IgS
zX(!r~meJmHAg!ds=ma{EPNK8uY&wT7ru)){a=MDHp$F4L=;8DTdJH{|o=8unXV5e0
zFX)x@Dta}&hF(jrqu0|L=#BIydMCY$-c9eJ57Ecy!X=|}YM
z^ke!D`cL{_`V~Vl4AYgdWULr_#({BUoET@ujqzmCnQSJ9$!7|f5(A@UdNRG3eoTL+
zoT*?2GJ_aBQ^O2q8klBgC^M27#UKVVA2Ab{Da=%61~ZeH&CFrim@k->%qnIzvxZsA
ztYg+QUoqR5?aU75Yi1|2i`mVbVa_t=nDfj9<|1>6`IfoN++=Psx0yT456oTW3G~;1A`-uIWea!yB{>lEu
z{>?sNUvU%%ILOf)!#Q$JoHHlpB%BN9%DHh0&YSb$V!1djo=e~oxg;)`OW{(vY%Yh(
zZTckVIwlzYa#9|jNAQt+6d%pU
z@UeUxAJ3=pnS2(n;q&-ze0RPF-;?jfm+|Gip0D9+`8s|mkNL6uIDS0;5kG;S$j{FD@hLNw3$Y_u5
zrTHasp`mpG35m#sBr@x$CTb{&!3|V3l|}CKBpU0;T@Z=Q9v=3T2bE4$QdNXXM^$d_
z#^-{r&Lc;XNdi40A~&zJhyeycHHrU1NK22w)&V)(BcjP+bSU1ZTk?Bw9WJ&!9b2lE|1!qG2|P
zg1txt98bdBd=k>O!d)bkT_K^%?J3RB655XrAQ38<4k1x0oQ|ZU=~z0RPBf0`Dh0{L
zMP1ds&Qo2eu0(3lR4V1Ql8T{XsW>X0N}v*{Br2IoK{m)136KzpkR7r|4#;sOr6K}Q
z6A@%knM6DuR1R_?iWDOsG!4x_^T_o=qEAmNv2lRq*M@#XQ|XmeO?3^a4Z1P`)um&~
zo>XtjtA*-?BrQ}QUNHz7%
zFHu)jG*#8rmNg7-B`uL1Y@4YO|H*cAJ6kU#lc&@#>BJ0EWBccq8(xMPVp>1+|n~MyydzwNYQ72$V{kE)A(sx=HT#CLIl{FRQK8Rkn*=+o01K
zZ@J_fce!{O7rJjZKY(9W$Jy&Qe~>2+=7r
z?hGMHBqNhd4d>fO#-rrdW1qOni>a&Bb;_%i^n6EJQ%o28&E0)dGxBv!L+cu!
zFuz0mt^@v$NQGn_9Y0Y&Q(jA!Aa4s}s++rkdPx2LhVU`UcuV*f_2kV;pQ23U-NE5G
z_0rU_7sa+v|Dvon9e{W^=>QOAx3ps;@)nrvJFTv^si97<*EIyyyk-I{fQ`u-luJNY
zU`e$AYofYbq(R{*Z#l3vsSk*N9m;Q4UIFTEQl5_y%iWDbDg;bOcdEi&$sy2lG(2g5?pod^aLfnrbsw4fXM0F|L~RDmj&
zgC4}^JwR{J2kD64JEJNzobVarvDX$RE>rj
z_j|_1gVA8@GBAb&Z3Hl?L4#2vYC_HD!Fccy89o6_1e1DaSL$k;ss>c)8oFf@R~v?E
zQ5~u`Dr7!g+T#+K20k{%*-GhFFx?nqD@%PndM2d;lTZT@QhiVDAQD9@JwiJ;SGM;J
zF!gmb&1-KOVrnu@mw9`bW8OHhsMQpe>%|za2jz3c6OTj&GAN+)7q1ouOH(LyN03QACUI2b4>-+pLZ&k}=9H?vG;Eju{KK1IYFB@Jrq{+04bj%$CL5JYnQ@Y0x1uzBQUNI
z@u!K(w6Fw>ZGl>}p7@(Noq;`IDdp7$dy@31H|zuZ!hWzn+JH8qO=vUPg1$ss+u#SV
z43@(RSP6A-0Qw4TL&wlX^bNX%z9s0MiZ-g?U^tu-wZR712%F##*bIllVQ4$rfxbpN
z(Jr(b?P-G};7B+Mj)r5%)fluF?L&vr5ph6CFf{2$|495(Vdgu}e_1FgZk?;@_TMP=Y0bRh=RbTnIl0!{A~{h0dW9
zB>EgjPR1!V(FVAbL?5^eE{7{%8#;+jq0{Kho9F{8iC0b{E1Qh!Nsd)m__n<7uFDU`f!f?u^aoi#O;3T)e%MVWS4Gq>|_CuK>}(A{tk
zXzo*4S23i9#Jq0BnqEy+HDsSJtEorl(FH`63i=vv1!;{bL7Zh!O}jV41Mr|RRO86D
z!b4P~=_iUr12A#gFsj69rD0CT}HzPO=
z&yan9%+v}`Q<3e_0iH8i*LidmH5=DEx@W;};ddlKftN|5eHC6q-=XX12Ks&(ybf;w
z6}*XVq94hYb{~27)aVAZXR^JDs|F5gzv``NcZ|HcO5G<;&Y>OVdJjG@vAhp|fWmsXm&2~)WOp_Gk-Q=8hqddsa-^fD9(6>VA7$T>=-pL|pAKH(ArG3%w
zEwn#++`ck(cf)^`2y~EX1*FnJf1tnLt{|L_eh)!WN*X34#O}EBQZ?FumHna
z4C^o)j9~-v-aOsg7WizYzoNXB(p%^+>8%*pW8i>+<5GGXy`A2HffEK~tS{L;4*D$g
z-%IZ|S?@j!oLlGv7)VG-@HQ6FM@?}D197Q9O#)$@@u06L^aOo|!~yyw{SAGJK8=A3
z2Cf*mVc@=uK1-jY&(jw$kYeD6fjgNB3(qDS=-5^bHI=I-L5J$t7;ncQEk8
zz~`+~{7C;y44b}3-=}}VK!yRaOR}h6h*W;XKw%PuH`$YNor8?&{*j8m=x6^y4gv`I
z3sNl*YF|RV*k2yS0HRg~Vp2skUtn0W4Uo-%;TWE=V7l~b)aiBY1vdsk7$`9a#2~z5
z^jeTv&Ui5j#+&hBd>KE+p9x?B86^|M1T!H_C=-T36b3OE#9@$t
zK@tWj7^pB%V~~MC76v&OXfVjfpb%474Ve5lkc##Y8hPOe_<}#4`y@_e3U%NoG=*
zR7S<5VbC3effzJnFcyPp7|g|BDF*8>*p9&w3@&1D6N85s{EMMAhOX}z1e0Ypi0D#5
z4l#&CLjHJ1lBCv*>H4Ap34E
z!4Pls5ZF4r!=lVgkZQaURBG1=-2iiYnz1lg)49Fc+@5Y+ADrHKHTCB9%u>OK_KDVp
zS{sW)!aI`;F_UDM3i8|KaXCcPnezy9cP>HF&-tB27|cC+ZxUFeX`
z6HYd_7nKUCUt@AL7KJ%Xk-U`o
zjG4>KW9Bmpn1#&e81%rPCkDMR=#4=i4EkcwuZ>yEEMZ!hR%R))j9HFBe+)`7D94}z
zgGvl^7z`jz@jAUU2$&B0-@uRq8j@o&o6vp?J|IaZ^CdcnK^c}%n9ZsxjczM9R~FnG-A+%!I1XbA)SF*c1&@F`OXaVnhEG&6VMwbpbhT>_1q^<
z5xfQ}7X){3_>uX|1o9qppZSUTnfZlzz>xSg6oX+H498#u1|u;Tg~8}HO2s^4eg_jN
zCsNRuk|YeqU{a^ok)6%-=@8^W1M`Z7?XXy2f@L7ESjGeky$_3q@)R>Fax~R`jLLRp
zNiEjKTC!HGHEYA#vI16!!8i=YWAG6M6EK*FOm*$_6A4P(PG_!xuf7|g(6CI+)G_yhwZkqaBe
zMw>*^A(q(~eD+!>?U|&Paa>{=sbCHo*mO3_j3d*8V@@l4$mXEC7?ASze}D+C%J=?{
zU<%ouCQL`2q3P3#c1nH|awV~4ZED3)Qc9D@}Yv|;cC1}iaG
zWtw#KyOXYdM-ZKeYV3x5DOvps1F*t|8c??K?
zq$A&*p*>}vo1y(&jVj
zRv28u;9CqXV{iq7s~B9v;5!11vwc^6HrG4ruR~&o4DOs~J1Wk@gz5%C#mP;mzJDJT
zd#D45FBf70;>Y=O0bC%b1bhdN
z0}w=mg~lm#OM(Qzhm$igFi6%6NA4n_`8kk$@SuTbMAe(zT}c@d`~cV
ziotUXUSROD{q|*Nm`xp1RB>k4=h|KW8L>C6-Sz)@A7<4Cd5ZUIrCt);>EO`JjWK~7
z$_?X&b0fHs+$e4|2Cp!rFa#Jv3~3A*4B0l$z>&w4+*r-aSGVweUNc$JT!odx*(#$sIYX?}Rd|V}={t
zEi=lSCY0VLv%Evh68gN45-K|e-RHBx)w7w+U<@f0a{A8?O#ogrbqYn41&00@2A}6So+nQNPE*}@3*+KkKXFKV>C1QJ
zEy-zA`}2UpvZg_;yp{1*uAPjx;cZI=j-({k)D2X>K1b8kRgfdAy4t0@fEOAaH8J+Q
z9q&M%$?*0VhPUuU;Spr-E7$n+;9YnxO7sQq%DeIIyp;FgJ$V@~$1n=RXbfX8jKwex
z!*~o6FiiY{Hy!uNd0*a-_vcA%hhY*qAxXn98N(C|Q!zQ7B_?6Ksaay^TU9@(u2xsq
z7#bQBQ7VY7Y;LO5HCI*Wl;)1Oa9w0KnSY`J!(Qu;PvDa&uU0;hPr^`*VMZ&T!V@5FS(uyv
zcP^&+46`cJ|F6=A&ovW}dZVMba&XJ%i-=9}1$-ff*%;=u^2K}!hPfDO$UqL4!mxNLKZvj5Kg5u5uEDS$v7TWC
zHAVGQ`Eq_R-@rHWP5clHwHWrnus?=n80y}X>ijT%l!@hVegr=f!)_RM$FRpzel$OZ
zH(=Nk!(JHnHl2%k8#fGcH);!~^`FE~`;Q^a@BDOv0$>dLwxcNW=%yM{rLXJ&KbxQX
zU&D^`^Ldh=HDXBC{Q&`ASmc(pgkSa_wES{@1>c5YIffM&Rw8eC@*{JwsGvL)kRs2a
z$om=mn$4?=7C5Tb^IIve6=Y=_`Az&tehdF)`}&CB29hOWI0(b475r$ho!`#yAjehP
z$#T(T42dN5iJGRsr00?CRAimNp1hJ_dJiCmyp9)5{==vUV*O?0g$|E=%aSb86GmQx2%%yGAGV)Y
z@h8axLCPAzx0*S_pCe(x)MjYm&tq7R%ny_JOK(WcL$9_!yfR;32V+;k0sQy;O(u-L
z&EMgF;P3K3^7qiU7!nbaa*5c%Pz;A-NYp(VL!x9%PV(Ls+WZ5vAvclYc0iS0N1~PS
zeozD{)CEqR$$mGJHNUm@&W8#7-{$UNZ;Mn>ry7=jZtfoOcC^(y#{d@Or9^Ug1xLMC
zd|R;Qo-yy7F?2pcu;^;0KySSTs?KVZmB9*IjklU$HOXqB)pDyqk<5p*_&Rboy
z`qt`-)jg{}t$Aw;YoWEo+Q&N3I@UVHT4k_STW473Sr=FrS(jLMv+i#_(7M@rwDm{U
z)2)|TueRQ1eZcyV^%3i1)+emLvA%45)%rW@8`d|iZ(ILh!`lSfw=qt+k(4-dxDKCmblO5;h5&g~Nm+grkIGgh;qbcux3}h!RKQcC+n1
zwVP|V)NZ+5o83yg)pl#`*4rJiduT7WSKEJR-)KL~euVuf`!V)2?c3}(*zdAGXn)-P
zy!|En%l238A38t>p@Wx0iorqUpmxY`$a2VW7~?R}VWz_;4znFTb(rfg-=WQ6lfyQL
z9S%Dkc01g0xa;tnqqU>RG1M{1F~w2ksCLYA?CsdsvA^R7jx~;Tj)NT=9p^c=I<`4(
zaNO?rgX2$5_D-HoF;0D)200m=u+uoFkDMktO?H~<^s&%@gQ-Xc(AxpJVZQH
zJYGCi{IPh3c$Rpsc)oa{c#(LCLA+VKQ+!N(Mtn|uL3~MkUHrZHmiUhNuJ{k}3rQD=
zKq8XZOB^L`5~;*fB9|y6F_LsijzlBLmy}4lNqR_nNrp=1NmfXSZ&zPef7d|QAlKfm4X#sM
zjjo@%&UKyd+UB~|b(`xB*PX7rUH7`~cRlEO-u0sEx2{)Quen}#{oeJK>mAoet}oo2
z+ydM(-E?k)-9C1k@3zuywcA>Q+j_T+Zkye{bo@BXX%L-*g^|8{@s{*U_$DU=GO5~+*SP3j@_lLknYQk7IK
z&5&kEbEF#S80kdmOz9`m+0sv?bEWg8ZPJy})zY=nebQ6XGtzU?3({Ls!yV~e={@P6
z(!ZrorT=(Xd5Ap}9>E@=9^oF59jFF_Y!!yd3kwxd-;0#dxd(1dqsLhd&PR?dTG6MUL(9_d#(4{KIMVcaAk*O$D^iuRu^iz~7$`zH0!HP!35XDf%
zc*O+8B*hfPX9mSQ#RA3WidBlWiuH<(iUW!>igSt!ic5-zipPpS6;Bk;yrDPi&3kw8
z7I`Olr+Qa=H+j$ZUhI9y`=3n6JTitnWv@
zlYFQ69`yaw&)qM;FUT*{FTyX{FV-)^FUv2-FVAnbUyI)=zqNiF{5Jb-_1ojO-|vv$
zQNI&@-}pWC_wn!UZ}6YyKf`~P|7`!y{O9?%`nUP7@?Yz}-hZe60sq7P$NW$FpZCAy
zf7$<<|8@Ug{GS>EECYfAVgk|wGyw$x#R1&{`Udn5_#mJnKo?LOFfL$Pz>I)T0%iv+
z4_F_tDd5Y1Z2?~g!a&PF=RmhWk3e~#Z(u-RP+&-4bYN0oNuVyUHgJ02oWL&wPXt~L
zyb^dd@VmgDlvYYxrAXIl+0s3xdB0UKPA1czuXLRB`Ziu`bc{S2-FY-a;Z;`)8{vG)=@_FRT
zD61&jDCa0ilxviGlt+{@Dj_O4N)?qJl@*m6l^<0U^+8lc)PSg}D1B62R72E|sG(7d
zqIN~yiRPn~(Z$gtqDMtfj-DPpGujwEH+p{b=h2I!*F|rP-VwbsdUy1R=&RA!qi;sv
ziT*MAr|1XK52ODz#85GG3>RY&(>2B_#wJD(6CKk%W>n0Qn8Pu@#M;Gr#42KaV*O)-
zV?$#jVxwZyW3yt5V*AI|#MZ|)#x}}sDdSUCrWnqq+(@~TayR9E
z%C9L8Qy!=MnM$W}sdlNdR7I+9YCvjGYG`UiYIJHwYF27)YJO@_sy4NIYOmBjsbf=H
zQjetmq7tg2RQ*-es(Mv}YKUrtYLv>L!m61nqiUgQk!p!*t!k%gk7~c_km{)FgzA*)
ztm>xfw(73xzUmj%ZwA%xsy|hKr@5siq?M;lNL!P3Htm_3Q(LO7)dIDH+DR=@yQ%}!
zLF#CAtU6wurS75bt?sA(KwY68psrHu)g#rT)kr-~{gHa2da`<|`eXGL^?CKPbhq@h
z^g-z}(?3sdO<$JYmcAx^UHZoK&FTBo52c?=zm@(&`n~j@(+$6-KT7{2{qGDm!y>~n
z!zM$RVV~iYA<1yfNXsbCn3S<5<6Op*OlhWPW>98$W@KheW@2V?rYcjNS(4d3voy0j
zQz8*2S#LhOFyZ-)G&<`XTF&tiQ8fWrJ)wTaYcymSroleX|3ygR(=jBeK)7
zGqSU@HQ5E(#o67mduI2}#@S1<4`=_JBgl!&>6cTQqt6+f)0oqoGcsp%4$2vuGb?9y
z&gVIcb6RrN
z4c3g;Ow>%#Ow-KJe4?47`AoB0b3KpF^U2H0Ysj0Qw=i#I-nzUEd7JaL6tvqw_z>
zU!K1{e^dUJ{4evj<$s-jH2=H&hxw25pBL~2Rt3%lo&|9QsRg|Y>I+5}pn`D)6AC65
zOf8sKu)1Jd!Lfpq1*Z$n6M!ivISg)<9R7H%zkT==x`RZ*8B$0C;^_ae_C?;^jVz@ng{_@cz3z!cCn_os90OvqqtXbd2wBF
zbMf%vQN@Ph3B{9(rx}W86wfL?Sp0qQ(-Kf(RbpErDsd=rE^#SwEAcN0Er}?JE{Q8i
zEm4vmuCTmsN
zbgf2Ppe@#R)ArEz*6OvxwMaWoJ3%{HJ5y`aeyW|PU7$5A)2`NTsZOg-uP&}GtuC+D
zRS&AJuCA>fTs@{5SC6ZnP(8VNYW2s}Gpe^#U(wTgr9MiZq|emn=u7my^`-hL`f2((
z`nme~`i1(H`ZfA>`i=T6`mOps`u+NY`osFu`ZM}-`fK_}`p5de^iTEA_5ap@8m5M?
z=~`o5W7}NgTH{{hQ6sMzTr;Ky)r_tAsODVF_cga_?$rEP8(pie&8W?)&8?kVyS%oo
zc4h6Fx~_Fjb>cdgI`_KKbyMo5)lILPRrh_}gSy}99@YI(UsPXFKd8Red^QE4`Pah1
L{M+$eU;qCACifUR
delta 14318
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
diff --git a/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.m b/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.m
index 192eea6..8c92bb6 100755
--- a/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.m
+++ b/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.m
@@ -160,7 +160,7 @@ -(NSURLSessionTask *)request:(PPRequestMethod)method URLString:(NSString *)URLSt
default:
break;
}
- NSURLSessionTask *sessionTask = [_sessionManager GET:URL parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
+ NSURLSessionTask *sessionTask = [_sessionManager GET:URLString parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
@@ -168,7 +168,7 @@ -(NSURLSessionTask *)request:(PPRequestMethod)method URLString:(NSString *)URLSt
[[self allSessionTask] removeObject:task];
success ? success(responseObject) : nil;
//对数据进行异步缓存
- responseCache!=nil ? [PPNetworkCache setHttpCache:responseObject URL:URL parameters:parameters] : nil;
+ responseCache!=nil ? [PPNetworkCache setHttpCache:responseObject URL:URLString parameters:parameters] : nil;
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
From c8a891954df24515f9e887fb98c2f89ed57ed2b5 Mon Sep 17 00:00:00 2001
From: mishan <903607388@qq.com>
Date: Sun, 30 Sep 2018 11:07:07 +0800
Subject: [PATCH 3/5] no message
---
.../UserInterfaceState.xcuserstate | Bin 32954 -> 33187 bytes
.../PPNetworkHelper/PPNetworkHelper.m | 1 -
2 files changed, 1 deletion(-)
diff --git a/PPNetworkHelper.xcodeproj/project.xcworkspace/xcuserdata/GSTB.xcuserdatad/UserInterfaceState.xcuserstate b/PPNetworkHelper.xcodeproj/project.xcworkspace/xcuserdata/GSTB.xcuserdatad/UserInterfaceState.xcuserstate
index 3f5f3d35dcf0fadd12081aa9f97a710931fefb3c..194a19df4da468f9458ced80288bee059fa12711 100644
GIT binary patch
delta 15291
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