From afdbfd49613b956e73b4a6f357cbad3cbcddcb8b Mon Sep 17 00:00:00 2001 From: mishan <903607388@qq.com> Date: Tue, 24 Jul 2018 13:12:18 +0800 Subject: [PATCH 1/5] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E6=94=B9=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E6=96=87=E4=BB=B6=E8=B7=AF=E5=BE=84=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E9=94=99=E8=AF=AF=202=E3=80=81=E6=B7=BB=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E6=9B=B4=E5=A4=9A=E7=9A=84=E8=AF=B7=E6=B1=82=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PPNetworkHelper.xcodeproj/project.pbxproj | 6 +- .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 31774 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 17 ++ .../xcschemes/xcschememanagement.plist | 14 ++ PPNetworkHelper/PPHTTPRequest.m | 9 +- PPNetworkHelper/PPInterfacedConst.h | 12 +- .../PPNetworkHelper/PPNetworkHelper.h | 117 ++++++------ .../PPNetworkHelper/PPNetworkHelper.m | 169 +++++++++--------- PPNetworkHelper/ViewController.m | 22 +-- 10 files changed, 200 insertions(+), 174 deletions(-) create mode 100644 PPNetworkHelper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 PPNetworkHelper.xcodeproj/project.xcworkspace/xcuserdata/GSTB.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 PPNetworkHelper.xcodeproj/xcuserdata/GSTB.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 PPNetworkHelper.xcodeproj/xcuserdata/GSTB.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/PPNetworkHelper.xcodeproj/project.pbxproj b/PPNetworkHelper.xcodeproj/project.pbxproj index 66f3a3f..8867e2e 100755 --- a/PPNetworkHelper.xcodeproj/project.pbxproj +++ b/PPNetworkHelper.xcodeproj/project.pbxproj @@ -344,7 +344,7 @@ TargetAttributes = { 22142E251D5E096E00EE2C40 = { CreatedOnToolsVersion = 7.3.1; - DevelopmentTeam = YY4NTQ7LN8; + DevelopmentTeam = 77LD5G9JF9; }; 22142E3E1D5E096E00EE2C40 = { CreatedOnToolsVersion = 7.3.1; @@ -554,7 +554,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = YY4NTQ7LN8; + DEVELOPMENT_TEAM = 77LD5G9JF9; INFOPLIST_FILE = PPNetworkHelper/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -570,7 +570,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = YY4NTQ7LN8; + DEVELOPMENT_TEAM = 77LD5G9JF9; INFOPLIST_FILE = PPNetworkHelper/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; diff --git a/PPNetworkHelper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/PPNetworkHelper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/PPNetworkHelper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/PPNetworkHelper.xcodeproj/project.xcworkspace/xcuserdata/GSTB.xcuserdatad/UserInterfaceState.xcuserstate b/PPNetworkHelper.xcodeproj/project.xcworkspace/xcuserdata/GSTB.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..75ad11527a8448d8087f3f451ccefa227259e994 GIT binary patch literal 31774 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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 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 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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 E01FU!#{d8T delta 14700 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 diff --git a/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.m b/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.m index 8c92bb6..4679b24 100755 --- a/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.m +++ b/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.m @@ -163,7 +163,6 @@ -(NSURLSessionTask *)request:(PPRequestMethod)method URLString:(NSString *)URLSt NSURLSessionTask *sessionTask = [_sessionManager GET:URLString parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - if (_isOpenLog) {PPLog(@"responseObject = %@",responseObject);} [[self allSessionTask] removeObject:task]; success ? success(responseObject) : nil; From 26219b015aeccbe9165905054ff51106e1da3826 Mon Sep 17 00:00:00 2001 From: lztbwlkj Date: Fri, 14 Dec 2018 11:48:44 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9PPNetworkHelper.m=20?= =?UTF-8?q?=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=9B=B4=E5=A4=9A=E7=9A=84=E8=AF=B7=E6=B1=82=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PPNetworkHelper.xcodeproj/project.pbxproj | 6 - .../UserInterfaceState.xcuserstate | Bin 33187 -> 35086 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 16 + .../xcschemes/xcschememanagement.plist | 5 + PPNetworkHelper/PPHTTPRequest.m | 9 +- PPNetworkHelper/PPInterfacedConst.h | 46 -- PPNetworkHelper/PPInterfacedConst.m | 25 - .../PPNetworkHelper/PPNetworkHelper.h | 20 +- .../PPNetworkHelper/PPNetworkHelper.m | 217 +++++--- PPNetworkHelper/ViewController.m | 32 +- PPNetworkHelper/YYCache/YYDiskCache.m | 484 ++---------------- 11 files changed, 246 insertions(+), 614 deletions(-) delete mode 100644 PPNetworkHelper/PPInterfacedConst.h delete mode 100644 PPNetworkHelper/PPInterfacedConst.m diff --git a/PPNetworkHelper.xcodeproj/project.pbxproj b/PPNetworkHelper.xcodeproj/project.pbxproj index 0414d28..679ab14 100755 --- a/PPNetworkHelper.xcodeproj/project.pbxproj +++ b/PPNetworkHelper.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 1D5FA55A1F0DE16900CD5B57 /* PPInterfacedConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D5FA5591F0DE16900CD5B57 /* PPInterfacedConst.m */; }; 22142E2B1D5E096E00EE2C40 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 22142E2A1D5E096E00EE2C40 /* main.m */; }; 22142E2E1D5E096E00EE2C40 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 22142E2D1D5E096E00EE2C40 /* AppDelegate.m */; }; 22142E311D5E096E00EE2C40 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 22142E301D5E096E00EE2C40 /* ViewController.m */; }; @@ -53,7 +52,6 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 1D5FA5591F0DE16900CD5B57 /* PPInterfacedConst.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PPInterfacedConst.m; sourceTree = ""; }; 22142E261D5E096E00EE2C40 /* PPNetworkHelper.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PPNetworkHelper.app; sourceTree = BUILT_PRODUCTS_DIR; }; 22142E2A1D5E096E00EE2C40 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 22142E2C1D5E096E00EE2C40 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; @@ -115,7 +113,6 @@ 22BEDC481D64B67100A72128 /* PPNetworkCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PPNetworkCache.m; sourceTree = ""; }; 22BEDC491D64B67100A72128 /* PPNetworkHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PPNetworkHelper.h; sourceTree = ""; }; 22BEDC4A1D64B67100A72128 /* PPNetworkHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PPNetworkHelper.m; sourceTree = ""; }; - 35639C3A1E9B616200FEA954 /* PPInterfacedConst.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PPInterfacedConst.h; sourceTree = ""; }; 35639C3D1E9B630C00FEA954 /* PPHTTPRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PPHTTPRequest.h; sourceTree = ""; }; 35639C3E1E9B630C00FEA954 /* PPHTTPRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PPHTTPRequest.m; sourceTree = ""; }; /* End PBXFileReference section */ @@ -290,8 +287,6 @@ 35639C401E9B634900FEA954 /* PPHTTPRequestLayer */ = { isa = PBXGroup; children = ( - 35639C3A1E9B616200FEA954 /* PPInterfacedConst.h */, - 1D5FA5591F0DE16900CD5B57 /* PPInterfacedConst.m */, 35639C3D1E9B630C00FEA954 /* PPHTTPRequest.h */, 35639C3E1E9B630C00FEA954 /* PPHTTPRequest.m */, ); @@ -411,7 +406,6 @@ 22BEDC4C1D64B67100A72128 /* PPNetworkHelper.m in Sources */, 22BEDC4B1D64B67100A72128 /* PPNetworkCache.m in Sources */, 224086591D7074EA007E4E15 /* AFURLSessionManager.m in Sources */, - 1D5FA55A1F0DE16900CD5B57 /* PPInterfacedConst.m in Sources */, 224086581D7074EA007E4E15 /* AFURLResponseSerialization.m in Sources */, 224086611D7074EA007E4E15 /* UIImageView+AFNetworking.m in Sources */, 224086711D7074F5007E4E15 /* YYMemoryCache.m in Sources */, diff --git a/PPNetworkHelper.xcodeproj/project.xcworkspace/xcuserdata/GSTB.xcuserdatad/UserInterfaceState.xcuserstate b/PPNetworkHelper.xcodeproj/project.xcworkspace/xcuserdata/GSTB.xcuserdatad/UserInterfaceState.xcuserstate index 194a19df4da468f9458ced80288bee059fa12711..85ebc18dbbbe905512f7da1fb9ef315e0e358019 100644 GIT binary patch delta 18215 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 X-_-uDaYGM6<6nNQ@vrH#{k{JWlAtsN delta 15963 zcmaia2Yi#o|NnFMtaK-Bk~Zl|($blxd!?m&?-6#Plr}(VI_O}CkUNITkQGn?71}aX zR1g%wFR}zgMD~^`0s^uGWy}Abh9Zjof61%O^W1#j=RTj$eeQiXb1v+h1ZT?_kyaF9 zd7}2GC2-oD^honCYB*I(jiBl%6ID+&P>oa*HHMl@&7@{gZ&B}3n0k*|N_{|mNKK+X zp+2M5P+w60qc&1osO{8u)DP4F>In5Cb&C3lx zgBH*V5Wrv}m;@$+*W!alGs><5i-C>#bGVG|q)N5k=O5}XRB!P#&g{1mQ&tKnyG4O|O9hhM;T z@JqNJZh#x%X1EO=goof^cmy7W$KXYH30{W3z$<2W72brm;B9yp-iLp}r!+^~(sr~x zEv6;3j8@P}+MV{GJ!vmmONY=pI+Tv4V`x2{K&R5#bPioa7t_7y-gG~@iXK8&)3tOX zJ(hlj9!F21U!z~A=g@QMh4do&U3v+d$%(_84R^fvk%+Pt0KLGPsZ(+B8- z^db5LeVRT)U!||nztY#~8}wcJ0Yftk!!jJhGa|;Babcv48{@@zGb$#431otpU`ES? zGto>xW*{?&8NyUE!S#uw@FWZmp&kkU#*&5c!j%LTOW7${OaqO$?cy`L})b`!gq-NJ5Vx3S-_+u1$r5A0s{9DAPqiM_!7%wA+K zv6tCj*emQ+_BZwpdza%lo)d94oGoX^*>et@qlRO?sa}iu5 zm%t@*J-K4bZQ8}$kL%A3;i|bBZWK3~8^ev|Ug5@ZuX5wL37nZj9OkBS)41u}d))in zVr~i7&UJ8|+){2Cx13wSeZZ~eKI7JK+qoUwPVQT77xx{voBN*I!~MYR<@RyMxZ~Uj z?i%+icb&Vz-Q;d@x4GZAJKQ7gG53V0dEU&6ct_recj4W6Z{CLw;B|Z`AI4|!nS2(X z&FApBd>)_A7x0CA5ns%g@TGh|ejq=HAHrAjb-anM=NtG&el$OZpU6+*C-YPIH~F{u zclZVTLVgkdF8?0Cg8zX3kYCGx&VRvg=C|-$`R)8+{s@1RKgLHN=TGrx`E&ev{vv;k zzsdi`KNZm;MkEs1h#W+YB4?3{$W`Pf@(_87)FO?@PvkEOw%lfWvKTm`3QGj{s{LpT z>=B1dXf&#|Y~Y^Sx{Vtb9Urb$MMPM(^8+;|G#9;#9-znQDF!yAoDS6v%+1Kmtf_5n zY))-9R#^%~d(D+%d1^~bZA)uaL#s8brJ!nTV_WMX%7(I~?5HxTg7W*2DyIxoFRC}y zhw4l9qxw?=kOC=@JMuuD$P0NR6;gjl4WtH9zEmdp4xy^48cK~cNZ-}94%MSK&{P3z ze^XcchGwI&Qf&EDHqW7t zQ!}Vc%Pd8iO$72o(WnQ~S*|K#&D3ma{!(fVHJ7qb^N>FZMjc6BjAKv$3PeGbVo6C!k+F4jV{=`O(bQyY*3}=R-lrB*OQ`n# zzSX9xmX?O9dShSfqp_t@>_O%rwYhqD?Wn3DCS!SPv*lf-J=;NbP@R^kN^g(8Mdigq zMi{Hf1X%lDCiIWALU)$)N|*l6lQX-LbttI25DMDJoBG zZmt^JL9L}a4^ivL5Wl3>QyZwZx$dr_NEC&rN^yl{NtD4-8OGUl59n)ZlV!2HoFLsy zkS=z2`e(lsT zl+aF{K#9a6hRQ=zsMFM0A^8mI*-o89NvPIPSXJB5UFm1)7s|Plx=3B3E~8|Wf>JxF zD@26XP#O{82x4bPM5WApcVicFeo1tpn=Fplx8RzM$k=j{VWJL0V(CY6o`QYI0F|{h>B1# zDp?9-Kn`4i8!AP;P;bM}}H!lW>pl3x!#+Funud)JSZnX`=^i5UG#3);h%`N(7V@p$GLyIxJs(QFl-_llHZER`L z53Q;-wKW^{mNx^!G7f=iBJLWh4Gg8$6YJ3pscJC}AivEK|QYgKU( z;p4~KbWdFyc!ly?3Pyp^Uzy*;W0muD!6a#@Mf{cG&Q)?CyT1fN4TMuYuRW8(=DGL9M6_ zjao{nsZ8)Dw7Qw03X+ zP5=K1;fNrFqu>~tfoAu5HS;2cyzRt8f2#kJNarJvPZbdTUSaQFE%{*ElD);eYP1+)*qLo^R9>_+Qj2cAG6 z^!O)u3Mn)ny@lTHgpl%u40?yaT|nHILaH;D_@v;zFCvBZQ2ej;T)OHlLKQwKO-ue( z!xef`e#@X6R6r$khaTuX^gddQmZ0`!&OfzkJ?I+xRgk=@Z#7YNU9M%9 ztvm3vY_)Z@$!%#N?tm=B!ka~9=We-R>(lqy*kKS1r~H<~V5o&5PzOU{80thz(K56g ztw0|vhY>ImMp0@QLxP(R(HCePk?Q}*AL&afOv{+2DiR*lbZNQ};#hp_)s}O1YRg)? zPz$ivbT3&j1*TEX?JyO6)DF|pN+PC#_6ld14ReX?VGjDZ9p<4=h?Wt@W|>vNXzWDZEBVsOl=b z3ax!s+{?ko9}b6glwSwQ89`D%7amHj*%hf-&mtS*GA*SNS97{<%%S2@sJCY8leDLyR{3l`$Ecj-Ko&Q$=GEFX3=>32R(8uBr_wSvp-gL4bzOR6 zeG@6rLRRwLRi-v$cmK!X8NtL(z?1MtcnY3IhtOek1RX`kmOe#zgiNHDd)B4OxxNMaI!3Rc%Bzq|a8P<$H0IN2S=SyKuSDM8aHS zO;OdT+F^p6Ihm6eU7zD%BWsWgc zw+T^BX2Yo3=EepgGBRg0)|23|s}GtY0SygkNYgZf&Y=tFBD(ZEprLtMMB?!C=qDi# z*F>s92K*xySB+?CY%nxFi$(^D>1P2A?a&p_{44}CeGS6}S*p7CA^qX6U706@%bE*7EF&FDx?LI_Mn@3)q{Gqe zb~+OMW_4+{bSxcbwNA@%N3UQykxqJEDjEI$+=}TmI)nHEIvxGdPG_Qfq=RR!&za7p z^M$NDbiW-!vOd&W206){=@OcF#CEzAJ#44T(Ib)^9hq#2friYB~ifZ3TB+1T3IJ2<*}dU^K<)`o;d_VR6LGnt5;5;j2< z6Q&A}jEEFMQdJoFhQ~*ce__$Fs@|1F<@(6TMzNAAA>Sg(NVQU<3FF#K*w-BLW+L3H zk-X^$6RT25DHYMx8p6)DlGK_?vEV!VSf*&SP%5|F9_ZrM+qy??cR`|d8L~&>Lv9L* z(%r+-*C(8{LAJ=wGSeqouTpD#{%vPX!ng8jvfwsYW84mn?_WD0gs(3d&-n2NRcc)*X{AqXLrvr8XRYXbNpg6^-}gP?zLwW~eZ690N~UhITeBoR{*65NU?38kcbs1PcG zilqt&yV63ajL)c@)VE}>dWlfZ56HF=0)~*zB0@Mz2(g?B(m^KKJT;JzAA#wFCl)ks z6<7xjg1g`ka34G*l&_8iCTWD+%_GEae^?90krmJU5n*q4!UM#gpMzK6V_HP$SAV)E zAzDl6!GvHX%1;lYhtng7rq>gybtK(Fx6z~Nv0ZT&MIt-v$MEd;*$@3H1`b`z7~M{H z41Dg2Gl;HrlB7^ zjDZ9LXAE30kYXUiK#qYc25uh_8(2fHr9Y>?px4n~((CCB^jCsGC@_r0P>*2_h6W5< zFl@ze6o%GNERFcix~8>${v7cCmL?H;C%udQj^2%d5(9S(JUZz;^bho23_LMNz{K0t zTFL|74LVF86+Frj47}RuW0>r>YhT#@(Wiv19tPf(;tWEN=q=@e&f#b2pGmw$pQF#y zKhYO3P-CFMzy|~0rSwJm5`CHe1%nA)yPe-K@auLvWcBKx z|Df+-;EzGbUmoWn{U`Ac^dtH){RD#m3<5C->ZG4iz6|kB!Gc7z#Fr?fVU}eBb1*c2jfX2%pp~ld5J7oem+AQ6Kk3{o&i!yp3#l9FSYt(BQE z=!-#rp@|$Om&s%DnF6MeDPoG55~h?XW6Bu=(~IfN^ueG41F|p>J9qo$>0$XS-2KIV-?J9! zV>uh%_+om8HNBsuDx%@V^cB|h0R(4RZ)?!be8j9Fd?2%u`Iz~H`IK43tY$vLU?2vA zFsQ^}Fa}i^48fp!1+$jkx27>ppsfO{5NBt4sf zuVrhd(vqCXTW%(5%wl`7pHE7Z)dh>?Vt+ByZCl?ld%D;?=6ggGxUK`d$?QdAFfgHt ze=vIzZew?)L(Go?>ch+t<|uQFInJD5h}sgfZp5GogOM0CW6**@>k8%+bDB||Va}4D zQ_N2ov|%s`gV7j}KF9-k9sA#~?ZlxzDdK0aeY$(U#oVz%{!M`ViU9d{0rI$)A*;7` zS9-`o0rDf}G4q7^lX=QgEOCD0F_?e>FSUv8}n@q97r2@Rq1b8b1cx(Oz-o0*kAG4ne@IGNbWmmDQ+0WQDELn;^ z$KVSL)?x4^2J0~(?&hn%!~5Sq;r;Lbgtvp;Wrg>x0B@rJZ?^#N>zCny(r$SB*kb~` z{pgSCV6Yv79RwbGf<4Lp$etiiX9OMFiNUvIm$QpJ z39sM%CqnTcpOjRq)`^R|d%niru)@7Az}+pty(Pf?{$;q%Te>U#&I-pn>>uns_CEW7 zeaJpyA7k(X2758shrxaf4q$K)gG0ofvrjpS1ME{uk;yS#{`@coM=&7cJ1pQm_TP8| zeNx<>;dOY{H7DW7kq|ki;ami~#|d6eF5o@!GG2JIyOKLcyv+*EgY)FPIB!nHsX5|v ze#GDu2B$GNgTYx0&S7x=#o3o-azTGhf0uIp^j}!Joi-Q6#aiLT2=Fcl@Ztq{KNBlH zo31QQ;<5xJ$y^GT%B6AXTn3kk!6ghXWAFl69fLnGxQD@g3?5+c5Q9f6xCX9~YvQ~{lAi{y6$7Fb zPcZlsgQr~&k1-*@|7&3pw~86d;QQ$e#+3B`-tPf6`rPE%!eG^5@(a z+&b<{Zauew`wBxB45b*#FqC8HilG~ZiWS^O?rUxnx0&G>Ch8`Gtc0G_+ zum6UukidaHDXM3x0SmkP-_ISgf<7pK_7*@N5kRY627T;tccqiuPXg#4xl`O}?hJR9 zJI9^JP=lclhQ1i~z|apve+&awa2JRxD5N|ynYG*n?h1y1UA};jn(Abw6UR+_v8J^md@BGM#=~B!Gsp%gD{M1=d~EdlR*dc_3y)n z^Lonp13rR}VVI0z3Wli|rhULC5JF7NC-KRA3ZF`m zc}gej*k}whFwDd-3&U*kUSV0@_hWNdr8vH3RBMfKRBg2}q_$~zV}ns2X^f5!i;Evp zZHzI-4hat*8d+5nJv2NzJft`ux^|IJj zOdrC(&v*Pw9hT*n5*%PMhE-iSN>#nm+G3zl~m8ERj!N+iM^X zlncd3gm|PNoQ1ADtEk*y9Mc+-W2_oA*3vR)fxS50kVTGN(oE#2Wvy%FRTr}w_&uZX zia;4KfZm`lr~re=#n2(32AIj!&-LJYu%A$RhslZXX>bnwM6P&V23No}aGl)g>_P5w z1`?7lo{)USunZ1>gUPMU7DDqOa?G`m9Bi#2cQkjwAIPoDW8{$LD!fNC!FuwglGp%(J{ z`2FPi(n2!#h&aJU3`dfav_PU&g{^8!ZtDaye}b~(Px3zsRCQ}@y;0ze8qT$Qy^Ud$ z)q|Yo&vcQAt;P=iG}YNCmJ;qXj0&gXs8GV8hLX1^N<~!>Vp&yWSDr(1A}Bp65hote zby~y!L{5Y#2L%7p(@Xp>#5s~QGi>LtVA%GIe&c_AUesFk)?cT0{2glkM}Xmf=l|gE z@%Q-${6qc`|CoP*h~f}0{R)P}jwWD8tY;#IL~&ok@C|Y*^cSrnf>swjmM|7p=Et&} z5b;^DPO=w?4H0iGHjY^SiylE_Z%rRBkPk0-3X#N`Zhnb85y`DN_#eJSPQr1&7Mk{9%Px*=3*A@ta;Y;X z<>cgosXK{wy-B1S#*O3_l8d01$;D1DKAzm)96)YrR`ONkrlye}#@F)ZI&xjJkzCSz zjkvFA{0!oxX7h9T`Q*ap0&-dNLt^~DlKYp=q5x4JQH^M{XtwA*(Q45e(dVLdqV=M$ zL>on$L|a7LL`Ou&L?=W)icX8piq4BJh%SmQi>`?7+Bn#_+eFy(v?;e4Wi!p@J)2K$ zzOgxNbKmBn&10KCZ7H*@!d7D&Xd7+Y*S5xXsO@mu5w<4V2HPgvDYoy}uCV>e_NeV~ z+mp7ZY|q%9vvam{xAV30vkR~bveVk>>=Nv<>`Ls)?1tJk+Pz{o$*#k0h22iO zeRikp&e)x^`^oOEJ+PbT2sx8okiy^cp5k2#)j{L%5WlZ}(w zDc&i~Dbp$2Dc7mDlhJ9I*{Rm4&Z*w1(P^Ypi_=7>$xg31z2P*?X@=8Gr`b+(ofbQ- zblT~3(&-PeRICywigU$fVuQH1xUaasxLRx!4-?ml>%{fqY2wx5!{R&Q$Kt0FAfYAp z5}CwRqL8>tJSE-|wZuoFmFOf1k`zgrBtw!b$(IyLiY2`y<{C-8q(RaoX_34tnJSqn z>69#!tdM*tSt)qh$2ser$2x!Lyv})(^KR!o&U>BrJD+eq>-@9xbr;&j*2Tp|?&9X6 zbP0Efa7lK_F}vis6u1<*l(_VB8Q?O|rP8I!rP{^hGTCL8%L13>E~{KVb6M;1h0B*N zTU@reY(x$jr4QrI_Y}pPU#`y&TmTZ%UGGc%~+~2vT3rnWea8R$`;GoWu3AwWm{xBWZ%lZlYK8c zE;}nbFS{VSDEn1*Lv~B{o9wRaPdP7_%H8Fja&Ng>9v}~rYvnq5m^@9MFYhZKARj0n zY?cp^*U0PT&GJ_HDES!q6!{GKO!;j2T=@d|BKdpr#qxIfD)~nFKKXw63Hc@Yb@@&C zZTTJfL-}L*pRSZEbhUGJbMl4?fZorLpW8IwHq;7IIvzwdJ&BM*hP30ErmgUyhZM55Rx7}{X+)lck zay#pG-tB_h?+U136}-Y$VXtshs1zZJC`F7SPN7$%D$*61ifl!$Vz8o0(V!Tu7^@hk z7_TrZ-cU?a%uvi!%vQ`*EKq!^_@82nVw+;S;ycCniXRmF6sHt-l$4TIvSy`7X{)qX zDwG~dFQr=PqwJxKP(~|bm3n2OGD(@QEK-&z%ay&9eUu}Vqm{2HUsalwSUE{KTRBHL zS2<7Fu3WGDO1V+FNx4P2O}SmUQ@KmITe(NMS9wu+S$RcyO?h2;Q+Zo?NBO(*p7Me6 zk@AVVn|rK#vHKwRW_R=J?u*=4xqt6|(fzRp>%n=5JR}~@9#Ria4Y9pJ*IkedVKA1+~bZX7ob-?S8*L|;t-n_Ssx1G0xx7^#u zyN9>Gcc6EScbvE0JJEZHcb)eb?^)h!yf=IA_TJ;Y*L%PBLGQ!fXT8sRU+})@ecAhp z_caw%X;lVQm8wQHRAsJJ)v4-LX4MSUo2r?r*{T()&sATlHmEkLHmSC#eo*aK9aJ4r z9aEi9T~pmxJyJbUQ);MY)Glh3+DF|(9iR?UYt<#{e(L_}3U#fzLEWToR*zPXRgY7T zSI<{}sot*sR{foNk9wc_fcm8Ry!vPLW%X6{uj&UHN(0RrM#E_wG-8djMy7Gq1Zg5Q zDVl6et|nhos4-~zX!>a?G=nrIO`B$-W~yeo=1t8k&0CrUnnjxTHA^&WHCr@0G`lq4 zYxZjnY7T3TYVP~UeY}1A{Tuz8{m1!F^`Gtkw*ON94gMSbH~Vk%-{HT@|9k(v{s;UI z`yccF)!%%>|F-{K|9k!q{htI-0dxQtU=v^$pb1D0C$!1%z#z~sQxz;S^q1CIp$6nHW4m%wX*Hv(@3J_&pp1cI2L{Gh%;RY5gD z!-7Tx)d!6V8XNR#kU3~#(Bz<1L1%&;f@6ZygR_Ej%)$A=MZqP({elMtR|VGu4-IY! zekFK(FbbX&JT3Um;90?QgXaZz1g{F-7JMoAX7FPzt>v^fT6?XFR;G2;DzzTk9$LLN zU7MxN)#hs}v_rMET9dX>+pOK7-KO2AJ*+*ZJ*hpb{YiUKds%x!`+JCOh(}0|kj#*R z5L1YGV#utJ*&%a6EFnumz6seG@?FTDkbNNsLym+T5BV|VOvw3=pF=K(Tn)J%ax3JH zPOekvJapbVjjo3-Ko_jj>B4nUx>%iF*Hf3GOV?%Ta&*0PeRTbF6}k^~>vZdNU+KOM z^#~0N4Gs+n4GSF~IxTcY=*-YLp|?Vxggy-e<}fC#EUYrDDy%weXxR3!17U~4j)WZ# z_X!URj|h(nj}0Fe{zmw;@EPH=BJ3j+5$+M55vquh5fdU%#Kedx5f>tEMf?_VH{xDo zW@K5UA+mR5zsMgVPez`KJQI07syM15YEabRsOqTwQKzHMMxBrPIXXHzExI(?5Zx!b zfAqj;^Wf;}=%LYV(PN^=MNf#v(UYTJkDeAiBl@%G6VXp&d}4BAnqp?f%!#qYyc_d= z%#xUnm{l>K$E=Il5VI*}OUyShJ7NyU9Elv$x z^@;V14UE;s>SD`d$HlhC?ufk>=NuOv7a12FmlT&`jw_5Si!;RaiK~bk6jv2j9oHP! z7B?|&PTah>x8oMZy%)D6t}||V+!t|Q#%+k(7`G{IOWd}&9dX~r{TeTg*T)ZvpB%q3 zes}z#_;c|W<1fcwjlUUxJN|C`A9_|V(#!N-dbQqH@2?NiN9tqraeBSJr#@LqzOI=VF}3zX$hGL zISKg*MG2(|hJ@+_W5Te65ecS*hJ>bsmV~y1g$dgdeo3@Xj7aR4I3^J%&P=o<&QE+N z@x8>wi5-bc6W1nwk+?1KK;q%VV~HmdPbZ#BypVXwocMdKgNw!I@NghdFN$MoOq=2O0q>!YypkSGsywTMagZ+^OD<>mnVOayfS%p@|xr?lD|ye znfzVy(d3KC=3kPpCErNCoqRX>Uh=~fn-seghZJ#&bBZ)Yo}x%`Pf1A`o-#9KP0I0< zr>S14!Kq=X5vkFs`qaeKhjbNQh!MOJMXK0JMP`nvR!8B~UUMpi~n zMrlTQ#^4NN#;}YL8I2huGg>o7WlYIXp?uYe3eZtg5Voa}ko3$hnwzn{G%dsX(D?9JJGvkzn+&OVlXGW&G)Idk@f?BB9~&%U4i zDErSGki+EgIW{@EoZdOF<}AtCnR7kYKG!iF9_8ESJLHS=UGnAmihPfJ?|fZ; zcz#rVY`#9fXMRe4dVXg9i2S+v>+??)z=FVnoPxZ9!h+rf{R)N_)D_ehG!?WJj4pVk z;MIcZ1v3j46?|0iNx|xZwFT=6HWX|u*j%u;;6TCQf@1|I3QiTAE%>S6XLF%VVR&Jm z!f}P|g}Vwb7hWm+qwrDTlOn2!E#ix8i|mWsi@b`0i*!ZdMNvhuMe#*hML9)zMTJEZ zi)IzgEt+5SPSK*G_lh zN*hXBN=KEBEge_-M(MQD8KtvIPnBLNy;gd?^j2BVvb?h5va+&XW&O(rmJK$S4JjL5 z)>t;C442I;vy{D6wxI0&vi7p2Wy{M}m2E8hrfg@~cV&CZ4wW4(J5hG3>`b|&Tw9)5 zUR2(%yrR6ad`P*me0ceY^3mlJ%5nMR^4H5}md`1lSN?YSg7R(Uw+tSJ9tN!;$&ha- zGxRd_H4HEeF&GWQ4RwZkL!+V1V4i50YM5b|WteMNV0hQC*wA5EYFJ^|VAyH+!LZ+O z$Z*tf+HlTr!Enj&i{ZB6elJiryUtR#r0$ct)pcv@*41sO+gP``Zcp95x&w8G>yFi( zsQa<*v>(TH-)q}bv7*@$&8ebbRVg<5_{z4Q`blI>=4QNMo}Yu F{vZ7wR*C=s diff --git a/PPNetworkHelper.xcodeproj/xcuserdata/GSTB.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/PPNetworkHelper.xcodeproj/xcuserdata/GSTB.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 8f94031..e83f929 100644 --- a/PPNetworkHelper.xcodeproj/xcuserdata/GSTB.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/PPNetworkHelper.xcodeproj/xcuserdata/GSTB.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -13,5 +13,21 @@ stopOnStyle = "0"> + + + + diff --git a/PPNetworkHelper.xcodeproj/xcuserdata/GSTB.xcuserdatad/xcschemes/xcschememanagement.plist b/PPNetworkHelper.xcodeproj/xcuserdata/GSTB.xcuserdatad/xcschemes/xcschememanagement.plist index 26c958b..60f46d5 100644 --- a/PPNetworkHelper.xcodeproj/xcuserdata/GSTB.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/PPNetworkHelper.xcodeproj/xcuserdata/GSTB.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,6 +9,11 @@ orderHint 0 + PPNetworkHelper.xcscheme_^#shared#^_ + + orderHint + 0 + diff --git a/PPNetworkHelper/PPHTTPRequest.m b/PPNetworkHelper/PPHTTPRequest.m index f9198a6..3fe54ff 100644 --- a/PPNetworkHelper/PPHTTPRequest.m +++ b/PPNetworkHelper/PPHTTPRequest.m @@ -7,7 +7,6 @@ // #import "PPHTTPRequest.h" -#import "PPInterfacedConst.h" #import "PPNetworkHelper.h" @implementation PPHTTPRequest @@ -15,13 +14,13 @@ @implementation PPHTTPRequest + (NSURLSessionTask *)getLoginWithParameters:(id)parameters success:(PPRequestSuccess)success failure:(PPRequestFailure)failure { // 将请求前缀与请求路径拼接成一个完整的URL - NSString *url = [NSString stringWithFormat:@"%@%@",kApiPrefix,KLogin]; + NSString *url = [NSString stringWithFormat:@"%@%@",@"https://www.baidu.com",@"/login"]; return [self requestWithURL:url parameters:parameters success:success failure:failure]; } /** 退出*/ + (NSURLSessionTask *)getExitWithParameters:(id)parameters success:(PPRequestSuccess)success failure:(PPRequestFailure)failure { - NSString *url = [NSString stringWithFormat:@"%@%@",kApiPrefix,kExit]; + NSString *url = [NSString stringWithFormat:@"%@%@",@"https://www.baidu.com",@"/exit"]; return [self requestWithURL:url parameters:parameters success:success failure:failure]; } @@ -37,10 +36,12 @@ + (NSURLSessionTask *)getExitWithParameters:(id)parameters success:(PPRequestSuc + (NSURLSessionTask *)requestWithURL:(NSString *)URL parameters:(NSDictionary *)parameter success:(PPRequestSuccess)success failure:(PPRequestFailure)failure { // 在请求之前你可以统一配置你请求的相关参数 ,设置请求头, 请求参数的格式, 返回数据的格式....这样你就不需要每次请求都要设置一遍相关参数 + + [PPNetworkHelper setResponseSerializer:PPResponseSerializerHTTP]; // 设置请求头 [PPNetworkHelper setValue:@"v1.0.0" forHTTPHeaderField:@"api-version"]; // 发起请求 - return [[PPNetworkHelper shareTools] request:POST URLString:URL parameters:parameter success:^(id responseObject) { + return [PPNetworkHelper request:POST URLString:URL parameters:parameter success:^(id responseObject) { // 在这里你可以根据项目自定义其他一些重复操作,比如加载页面时候的等待效果, 提醒弹窗.... success(responseObject); diff --git a/PPNetworkHelper/PPInterfacedConst.h b/PPNetworkHelper/PPInterfacedConst.h deleted file mode 100644 index d5ae005..0000000 --- a/PPNetworkHelper/PPInterfacedConst.h +++ /dev/null @@ -1,46 +0,0 @@ -// -// PPInterfacedConst.h -// PPNetworkHelper -// -// Created by AndyPang on 2017/4/10. -// Copyright © 2017年 AndyPang. All rights reserved. -// - -#import -/* - - 将项目中所有的接口写在这里,方便统一管理,降低耦合 - - 这里通过宏定义来切换你当前的服务器类型, - 将你要切换的服务器类型宏后面置为真(即>0即可),其余为假(置为0) - 如下:现在的状态为测试服务器 - 这样做切换方便,不用来回每个网络请求修改请求域名,降低出错事件 - */ - - -#ifndef PPInterfacedConst_h -#define PPInterfacedConst_h - -#define DevelopSever 0 -#define TestSever 1 -#define ProductSever 0 - -/** 接口前缀-开发服务器*/ -NSString *const kApiPrefix = @""; -#elif TestSever -/** 接口前缀-测试服务器*/ -NSString *const kApiPrefix = @""; -#elif ProductSever -/** 接口前缀-生产服务器*/ -NSString *const kApiPrefix = @""; -#endif - - -#pragma mark - 详细接口地址 -/** 登录*/ -NSString *const KLogin = @""; -/** 平台会员退出*/ -NSString *const kApiPrefix = @""; - - - diff --git a/PPNetworkHelper/PPInterfacedConst.m b/PPNetworkHelper/PPInterfacedConst.m deleted file mode 100644 index bf14af4..0000000 --- a/PPNetworkHelper/PPInterfacedConst.m +++ /dev/null @@ -1,25 +0,0 @@ -// -// PPInterfacedConst.m -// PPNetworkHelper -// -// Created by YiAi on 2017/7/6. -// Copyright © 2017年 AndyPang. All rights reserved. -// - -#import "PPInterfacedConst.h" - -#if DevelopSever -/** 接口前缀-开发服务器*/ -NSString *const kApiPrefix = @"接口服务器的请求前缀 例: http://192.168.10.10:8080"; -#elif TestSever -/** 接口前缀-测试服务器*/ -NSString *const kApiPrefix = @"https://www.baidu.com"; -#elif ProductSever -/** 接口前缀-生产服务器*/ -NSString *const kApiPrefix = @"https://www.baidu.com"; -#endif - -/** 登录*/ -NSString *const kLogin = @"/login"; -/** 平台会员退出*/ -NSString *const kExit = @"/exit"; diff --git a/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.h b/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.h index 722c6a9..0fd0d2d 100755 --- a/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.h +++ b/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.h @@ -93,12 +93,6 @@ typedef void(^PPNetworkStatus)(PPNetworkStatusType status); @interface PPNetworkHelper : AFHTTPSessionManager -/** - * 所有的HTTP请求共享一个AFHTTPSessionManager - * 原理参考地址:http://www.jianshu.com/p/5969bbb4af9f - */ - -+(instancetype)shareTools; /** 有网YES, 无网:NO */ @@ -123,12 +117,12 @@ typedef void(^PPNetworkStatus)(PPNetworkStatusType status); /** 取消所有HTTP请求 */ -- (void)cancelAllRequest; ++ (void)cancelAllRequest; /** 取消指定URL的HTTP请求 */ -- (void)cancelRequestWithURL:(NSString *)URL; ++ (void)cancelRequestWithURL:(NSString *)URL; /** @@ -142,7 +136,7 @@ typedef void(^PPNetworkStatus)(PPNetworkStatusType status); @param failure 请求失败的回调 @return 返回的对象可取消请求,调用cancel方法 */ --(NSURLSessionTask *)request:(PPRequestMethod)method URLString:(NSString *)URLString parameters:(id)parameters ++(NSURLSessionTask *)request:(PPRequestMethod)method URLString:(NSString *)URLString parameters:(id)parameters responseCache:(PPHttpRequestCache)responseCache success:(PPHttpRequestSuccess)success failure:(PPHttpRequestFailed)failure; @@ -158,7 +152,7 @@ typedef void(^PPNetworkStatus)(PPNetworkStatusType status); @param failure 请求失败的回调 @return 返回的对象可取消请求,调用cancel方法 */ --(NSURLSessionTask *)request:(PPRequestMethod)method URLString:(NSString *)URLString parameters:(id)parameters ++(NSURLSessionTask *)request:(PPRequestMethod)method URLString:(NSString *)URLString parameters:(id)parameters success:(PPHttpRequestSuccess)success failure:(PPHttpRequestFailed)failure; @@ -175,7 +169,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 @@ -199,7 +193,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 @@ -221,7 +215,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 4679b24..07692ce 100755 --- a/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.m +++ b/PPNetworkHelper/PPNetworkHelper/PPNetworkHelper.m @@ -21,7 +21,7 @@ //网络工具协议 @protocol NetworkToolsProxy @optional -- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method ++ (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method URLString:(NSString *)URLString parameters:(id)parameters uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress @@ -37,26 +37,9 @@ @interface PPNetworkHelper() @implementation PPNetworkHelper static BOOL _isOpenLog; // 是否已开启日志打印 -static NSMutableArray *_allSessionTask; -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; -} - - +static AFHTTPSessionManager *_sessionManager; +static NSMutableArray *_allSessionTask; #pragma mark - 开始监听网络 + (void)networkStatusWithBlock:(PPNetworkStatus)networkStatus { @@ -103,9 +86,11 @@ + (void)closeLog { _isOpenLog = NO; } -- (void)cancelAllRequest { ++ (void)cancelAllRequest +{ // 锁操作 - @synchronized(self) { + @synchronized(self) + { [[self allSessionTask] enumerateObjectsUsingBlock:^(NSURLSessionTask *_Nonnull task, NSUInteger idx, BOOL * _Nonnull stop) { [task cancel]; }]; @@ -113,10 +98,13 @@ - (void)cancelAllRequest { } } -- (void)cancelRequestWithURL:(NSString *)URL { ++ (void)cancelRequestWithURL:(NSString *)URL +{ if (!URL) { return; } - @synchronized (self) { + @synchronized (self) + { [[self allSessionTask] enumerateObjectsUsingBlock:^(NSURLSessionTask *_Nonnull task, NSUInteger idx, BOOL * _Nonnull stop) { + if ([task.currentRequest.URL.absoluteString hasPrefix:URL]) { [task cancel]; [[self allSessionTask] removeObject:task]; @@ -126,66 +114,147 @@ - (void)cancelRequestWithURL:(NSString *)URL { } } --(NSURLSessionTask *)request:(PPRequestMethod)method URLString:(NSString *)URLString parameters:(id)parameters + ++(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]; } --(NSURLSessionTask *)request:(PPRequestMethod)method URLString:(NSString *)URLString parameters:(id)parameters ++ (NSURLSessionTask *)request:(PPRequestMethod)method URLString:(NSString *)URLString parameters:(id)parameters responseCache:(PPHttpRequestCache)responseCache success:(PPHttpRequestSuccess)success failure:(PPHttpRequestFailed)failure{ - NSString *methodString = @""; + //读取缓存 + responseCache ? responseCache([PPNetworkCache httpCacheForURL:URLString parameters:parameters]) : nil; + + NSURLSessionTask *sessionTask = nil; switch (method) { case GET: - methodString = @"GET"; + { + sessionTask = [_sessionManager GET:URLString parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) { + + } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + + [[self allSessionTask] removeObject:task]; + success ? success(responseObject) : nil; + //对数据进行异步缓存 + responseCache ? [PPNetworkCache setHttpCache:responseObject URL:URLString parameters:parameters] : nil; + PPLog(@"responseObject = %@",[self jsonToString:responseObject]); + + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + + [[self allSessionTask] removeObject:task]; + failure ? failure(error) : nil; + PPLog(@"error = %@",error); + + }]; + } break; - case POST: - methodString = @"POST"; + case POST:{ + sessionTask = [_sessionManager POST:URLString parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) { + + } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + + [[self allSessionTask] removeObject:task]; + success ? success(responseObject) : nil; + //对数据进行异步缓存 + responseCache ? [PPNetworkCache setHttpCache:responseObject URL:URLString parameters:parameters] : nil; + PPLog(@"responseObject = %@",[self jsonToString:responseObject]); + + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + + [[self allSessionTask] removeObject:task]; + failure ? failure(error) : nil; + PPLog(@"error = %@",error); + + }]; + } break; - case DELETE: - methodString = @"DELETE"; + case DELETE:{ + sessionTask = [_sessionManager DELETE:URLString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + + [[self allSessionTask] removeObject:task]; + success ? success(responseObject) : nil; + //对数据进行异步缓存 + responseCache ? [PPNetworkCache setHttpCache:responseObject URL:URLString parameters:parameters] : nil; + PPLog(@"responseObject = %@",[self jsonToString:responseObject]); + + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + + [[self allSessionTask] removeObject:task]; + failure ? failure(error) : nil; + PPLog(@"error = %@",error); + + }]; + } + break; case HEAD: - methodString = @"HEAD"; + { + [_sessionManager HEAD:URLString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task) { + [[self allSessionTask] removeObject:task]; + success ? success(task) : nil; + + + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + [[self allSessionTask] removeObject:task]; + failure ? failure(error) : nil; + PPLog(@"error = %@",error); + }]; + } break; - case PUT: - methodString = @"PUT"; + case PUT:{ + sessionTask = [_sessionManager PUT:URLString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + + [[self allSessionTask] removeObject:task]; + success ? success(responseObject) : nil; + //对数据进行异步缓存 + responseCache ? [PPNetworkCache setHttpCache:responseObject URL:URLString parameters:parameters] : nil; + PPLog(@"responseObject = %@",[self jsonToString:responseObject]); + + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + + [[self allSessionTask] removeObject:task]; + failure ? failure(error) : nil; + PPLog(@"error = %@",error); + + }]; + } + break; case PATCH: - methodString = @"PATCH"; + { + sessionTask = [_sessionManager PATCH:URLString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + + [[self allSessionTask] removeObject:task]; + success ? success(responseObject) : nil; + //对数据进行异步缓存 + responseCache ? [PPNetworkCache setHttpCache:responseObject URL:URLString parameters:parameters] : nil; + PPLog(@"responseObject = %@",[self jsonToString:responseObject]); + + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + + [[self allSessionTask] removeObject:task]; + failure ? failure(error) : nil; + PPLog(@"error = %@",error); + + }]; + } break; default: break; } - NSURLSessionTask *sessionTask = [_sessionManager GET:URLString parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) { - - } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - if (_isOpenLog) {PPLog(@"responseObject = %@",responseObject);} - [[self allSessionTask] removeObject:task]; - success ? success(responseObject) : nil; - //对数据进行异步缓存 - responseCache!=nil ? [PPNetworkCache setHttpCache:responseObject URL:URLString parameters:parameters] : nil; - - } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull 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 @@ -222,7 +291,8 @@ - (NSURLSessionTask *)uploadFileWithURL:(NSString *)URL } #pragma mark - 上传多张图片 -- (NSURLSessionTask *)uploadImagesWithURL:(NSString *)URL + ++ (NSURLSessionTask *)uploadImagesWithURL:(NSString *)URL parameters:(id)parameters name:(NSString *)name images:(NSArray *)images @@ -275,7 +345,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 @@ -316,16 +386,20 @@ - (NSURLSessionTask *)downloadWithURL:(NSString *)URL /** * json转字符串 */ -- (NSString *)jsonToString:(id)data { ++ (NSString *)jsonToString:(id)data { if(data == nil) { return nil; } + if ([data isKindOfClass:[NSData class]]) { + return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + } NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data options:NSJSONWritingPrettyPrinted error:nil]; return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + } /** 存储着所有的请求task数组 */ -- (NSMutableArray *)allSessionTask { ++ (NSMutableArray *)allSessionTask { if (!_allSessionTask) { _allSessionTask = [[NSMutableArray alloc] init]; } @@ -341,11 +415,20 @@ + (void)load { } -//+ (void)initialize { -// _sessionManager = [AFHTTPSessionManager manager]; -// -//} - ++ (void)initialize { + _sessionManager = [AFHTTPSessionManager manager]; + // 设置请求参数的类型:JSON (AFJSONRequestSerializer,AFHTTPRequestSerializer) + _sessionManager.requestSerializer = [AFJSONRequestSerializer serializer]; + // 设置请求的超时时间 + _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; +} + #pragma mark - 重置AFHTTPSessionManager相关属性 diff --git a/PPNetworkHelper/ViewController.m b/PPNetworkHelper/ViewController.m index 90e0372..3747d8b 100755 --- a/PPNetworkHelper/ViewController.m +++ b/PPNetworkHelper/ViewController.m @@ -106,7 +106,11 @@ - (void)viewDidLoad { [self getCurrentNetworkStatus]; }); - [self PPHTTPRequestLayerDemo]; +// [self PPHTTPRequestLayerDemo]; + + + BOOL isOn = [[[NSUserDefaults standardUserDefaults] objectForKey:@"isOn"] boolValue]; + [self getData:isOn url:dataUrl]; } /** @@ -130,6 +134,7 @@ - (void)PPHTTPRequestLayerDemo // } failure:^(NSError *error) { // // }]; + } @@ -137,19 +142,23 @@ - (void)PPHTTPRequestLayerDemo #pragma mark - 这里的请求只是一个演示, 在真实的项目中建议不要这样做, 具体做法可以参照PPHTTPRequestLayer文件夹的例子 - (void)getData:(BOOL)isOn url:(NSString *)url { - + self.networkData.editable = NO; + self.cacheData.editable = NO; + NSDictionary *para = @{ @"a":@"list", @"c":@"data",@"client":@"iphone",@"page":@"0",@"per":@"10", @"type":@"29"}; // 自动缓存 if(isOn) { self.cacheStatus.text = @"缓存打开"; self.cacheSwitch.on = YES; - [[PPNetworkHelper shareTools] request:GET URLString:url parameters:para responseCache:^(id responseCache) { + + [PPNetworkHelper request:GET URLString:url parameters:para responseCache:^(id responseCache) { // 1.先加载缓存数据 - self.cacheData.text = [self jsonToString:responseCache]; + self.cacheData.text = [NSString stringWithFormat:@"%@",responseCache]; } success:^(id responseObject) { // 2.再请求网络数据 - self.networkData.text = [self jsonToString:responseObject]; + self.networkData.text = [NSString stringWithFormat:@"%@",responseObject]; + self.cacheData.text = self.networkData.text; } failure:^(NSError *error) { }]; @@ -158,14 +167,16 @@ - (void)getData:(BOOL)isOn url:(NSString *)url // 无缓存 else { + self.cacheStatus.text = @"缓存关闭"; self.cacheSwitch.on = NO; self.cacheData.text = @""; - [[PPNetworkHelper shareTools] request:GET URLString:url parameters:para success:^(id responseObject) { + [PPNetworkHelper request:GET URLString:url parameters:para success:^(id responseObject) { // 2.再请求网络数据 - self.networkData.text = [self jsonToString:responseObject]; + self.networkData.text = [NSString stringWithFormat:@"%@",responseObject]; } failure:^(NSError *error) { + }]; @@ -238,7 +249,7 @@ - (IBAction)download:(UIButton *)sender { self.download = YES; [self.downloadBtn setTitle:@"取消下载" forState:UIControlStateNormal]; - task = [[PPNetworkHelper shareTools] downloadWithURL:downloadUrl fileDir:@"Download" progress:^(NSProgress *progress) { + task = [PPNetworkHelper downloadWithURL:downloadUrl fileDir:@"Download" progress:^(NSProgress *progress) { CGFloat stauts = 100.f * progress.completedUnitCount/progress.totalUnitCount; self.progress.progress = stauts/100.f; @@ -274,9 +285,6 @@ - (IBAction)download:(UIButton *)sender { self.progress.progress = 0; [self.downloadBtn setTitle:@"开始下载" forState:UIControlStateNormal]; } - - - } #pragma mark - 缓存开关 @@ -289,7 +297,7 @@ - (IBAction)isCache:(UISwitch *)sender { /** * json转字符串 */ -- (NSString *)jsonToString:(NSDictionary *)dic +- (NSString *)jsonToString:(NSData *)dic { if(!dic){ return nil; diff --git a/PPNetworkHelper/YYCache/YYDiskCache.m b/PPNetworkHelper/YYCache/YYDiskCache.m index 735cc5d..917e238 100755 --- a/PPNetworkHelper/YYCache/YYDiskCache.m +++ b/PPNetworkHelper/YYCache/YYDiskCache.m @@ -1,3 +1,7 @@ +// The converted code is limited to 2 KB. +// Upgrade your plan to remove this limitation. +// +// Converted to Swift 4 by Swiftify v4.2.20547 - https://objectivec2swift.com/ // // YYDiskCache.m // YYCache @@ -8,451 +12,49 @@ // This source code is licensed under the MIT-style license found in the // LICENSE file in the root directory of this source tree. // - -#import "YYDiskCache.h" -#import "YYKVStorage.h" -#import -#import -#import -#import - -#define Lock() dispatch_semaphore_wait(self->_lock, DISPATCH_TIME_FOREVER) -#define Unlock() dispatch_semaphore_signal(self->_lock) - -static const int extended_data_key; - -/// Free disk space in bytes. -static int64_t _YYDiskSpaceFree() { - NSError *error = nil; - NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:&error]; - if (error) return -1; - int64_t space = [[attrs objectForKey:NSFileSystemFreeSize] longLongValue]; - if (space < 0) space = -1; - return space; +import CommonCrypto +import ObjectiveC +import UIKit +func Lock() { + dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER) } - -/// String's md5 hash. -static NSString *_YYNSStringMD5(NSString *string) { - if (!string) return nil; - NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; - unsigned char result[CC_MD5_DIGEST_LENGTH]; - CC_MD5(data.bytes, (CC_LONG)data.length, result); - return [NSString stringWithFormat: - @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", - result[0], result[1], result[2], result[3], - result[4], result[5], result[6], result[7], - result[8], result[9], result[10], result[11], - result[12], result[13], result[14], result[15] - ]; +func Unlock() -> Int { + return lock.signal() } - +private let extended_data_key: Int = 0 /// weak reference for all instances -static NSMapTable *_globalInstances; -static dispatch_semaphore_t _globalInstancesLock; - -static void _YYDiskCacheInitGlobal() { - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - _globalInstancesLock = dispatch_semaphore_create(1); - _globalInstances = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsStrongMemory valueOptions:NSPointerFunctionsWeakMemory capacity:0]; - }); -} - -static YYDiskCache *_YYDiskCacheGetGlobal(NSString *path) { - if (path.length == 0) return nil; - _YYDiskCacheInitGlobal(); - dispatch_semaphore_wait(_globalInstancesLock, DISPATCH_TIME_FOREVER); - id cache = [_globalInstances objectForKey:path]; - dispatch_semaphore_signal(_globalInstancesLock); - return cache; -} - -static void _YYDiskCacheSetGlobal(YYDiskCache *cache) { - if (cache.path.length == 0) return; - _YYDiskCacheInitGlobal(); - dispatch_semaphore_wait(_globalInstancesLock, DISPATCH_TIME_FOREVER); - [_globalInstances setObject:cache forKey:cache.path]; - dispatch_semaphore_signal(_globalInstancesLock); -} - - - -@implementation YYDiskCache { - YYKVStorage *_kv; - dispatch_semaphore_t _lock; - dispatch_queue_t _queue; -} - -- (void)_trimRecursively { - __weak typeof(self) _self = self; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(_autoTrimInterval * NSEC_PER_SEC)), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ - __strong typeof(_self) self = _self; - if (!self) return; - [self _trimInBackground]; - [self _trimRecursively]; - }); -} - -- (void)_trimInBackground { - __weak typeof(self) _self = self; - dispatch_async(_queue, ^{ - __strong typeof(_self) self = _self; - if (!self) return; - Lock(); - [self _trimToCost:self.costLimit]; - [self _trimToCount:self.countLimit]; - [self _trimToAge:self.ageLimit]; - [self _trimToFreeDiskSpace:self.freeDiskSpaceLimit]; - Unlock(); - }); -} - -- (void)_trimToCost:(NSUInteger)costLimit { - if (costLimit >= INT_MAX) return; - [_kv removeItemsToFitSize:(int)costLimit]; - -} - -- (void)_trimToCount:(NSUInteger)countLimit { - if (countLimit >= INT_MAX) return; - [_kv removeItemsToFitCount:(int)countLimit]; -} - -- (void)_trimToAge:(NSTimeInterval)ageLimit { - if (ageLimit <= 0) { - [_kv removeAllItems]; - return; - } - long timestamp = time(NULL); - if (timestamp <= ageLimit) return; - long age = timestamp - ageLimit; - if (age >= INT_MAX) return; - [_kv removeItemsEarlierThanTime:(int)age]; -} - -- (void)_trimToFreeDiskSpace:(NSUInteger)targetFreeDiskSpace { - if (targetFreeDiskSpace == 0) return; - int64_t totalBytes = [_kv getItemsSize]; - if (totalBytes <= 0) return; - int64_t diskFreeBytes = _YYDiskSpaceFree(); - if (diskFreeBytes < 0) return; - int64_t needTrimBytes = targetFreeDiskSpace - diskFreeBytes; - if (needTrimBytes <= 0) return; - int64_t costLimit = totalBytes - needTrimBytes; - if (costLimit < 0) costLimit = 0; - [self _trimToCost:(int)costLimit]; -} - -- (NSString *)_filenameForKey:(NSString *)key { - NSString *filename = nil; - if (_customFileNameBlock) filename = _customFileNameBlock(key); - if (!filename) filename = _YYNSStringMD5(key); - return filename; -} - -- (void)_appWillBeTerminated { - Lock(); - _kv = nil; - Unlock(); -} - -#pragma mark - public - -- (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillTerminateNotification object:nil]; -} - -- (instancetype)init { - @throw [NSException exceptionWithName:@"YYDiskCache init error" reason:@"YYDiskCache must be initialized with a path. Use 'initWithPath:' or 'initWithPath:inlineThreshold:' instead." userInfo:nil]; - return [self initWithPath:@"" inlineThreshold:0]; -} - -- (instancetype)initWithPath:(NSString *)path { - return [self initWithPath:path inlineThreshold:1024 * 20]; // 20KB -} - -- (instancetype)initWithPath:(NSString *)path - inlineThreshold:(NSUInteger)threshold { - self = [super init]; - if (!self) return nil; - - YYDiskCache *globalCache = _YYDiskCacheGetGlobal(path); - if (globalCache) return globalCache; - - YYKVStorageType type; - if (threshold == 0) { - type = YYKVStorageTypeFile; - } else if (threshold == NSUIntegerMax) { - type = YYKVStorageTypeSQLite; - } else { - type = YYKVStorageTypeMixed; - } - - YYKVStorage *kv = [[YYKVStorage alloc] initWithPath:path type:type]; - if (!kv) return nil; - - _kv = kv; - _path = path; - _lock = dispatch_semaphore_create(1); - _queue = dispatch_queue_create("com.ibireme.cache.disk", DISPATCH_QUEUE_CONCURRENT); - _inlineThreshold = threshold; - _countLimit = NSUIntegerMax; - _costLimit = NSUIntegerMax; - _ageLimit = DBL_MAX; - _freeDiskSpaceLimit = 0; - _autoTrimInterval = 60; - - [self _trimRecursively]; - _YYDiskCacheSetGlobal(self); - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_appWillBeTerminated) name:UIApplicationWillTerminateNotification object:nil]; - return self; -} - -- (BOOL)containsObjectForKey:(NSString *)key { - if (!key) return NO; - Lock(); - BOOL contains = [_kv itemExistsForKey:key]; - Unlock(); - return contains; -} - -- (void)containsObjectForKey:(NSString *)key withBlock:(void(^)(NSString *key, BOOL contains))block { - if (!block) return; - __weak typeof(self) _self = self; - dispatch_async(_queue, ^{ - __strong typeof(_self) self = _self; - BOOL contains = [self containsObjectForKey:key]; - block(key, contains); - }); -} - -- (id)objectForKey:(NSString *)key { - if (!key) return nil; - Lock(); - YYKVStorageItem *item = [_kv getItemForKey:key]; - Unlock(); - if (!item.value) return nil; - - id object = nil; - if (_customUnarchiveBlock) { - object = _customUnarchiveBlock(item.value); - } else { - @try { - object = [NSKeyedUnarchiver unarchiveObjectWithData:item.value]; - } - @catch (NSException *exception) { - // nothing to do... - } +private var _globalInstances: NSMapTable? +private var _globalInstancesLock: DispatchSemaphore? +/// Free disk space in bytes. +private func YYDiskSpaceFree() -> Int64 { + var error: Error? = nil + let attrs = try? FileManager.default.attributesOfFileSystem(forPath: NSHomeDirectory()) + if error != nil { + return -1 } - if (object && item.extendedData) { - [YYDiskCache setExtendedData:item.extendedData toObject:object]; + var space = Int64(attrs?[.systemFreeSize] ?? 0) + if Int(space) < 0 { + space = -1 } - return object; -} - -- (void)objectForKey:(NSString *)key withBlock:(void(^)(NSString *key, id object))block { - if (!block) return; - __weak typeof(self) _self = self; - dispatch_async(_queue, ^{ - __strong typeof(_self) self = _self; - id object = [self objectForKey:key]; - block(key, object); - }); + return space } - -- (void)setObject:(id)object forKey:(NSString *)key { - if (!key) return; - if (!object) { - [self removeObjectForKey:key]; - return; - } - - NSData *extendedData = [YYDiskCache getExtendedDataFromObject:object]; - NSData *value = nil; - if (_customArchiveBlock) { - value = _customArchiveBlock(object); - } else { - @try { - value = [NSKeyedArchiver archivedDataWithRootObject:object]; - } - @catch (NSException *exception) { - // nothing to do... - } - } - if (!value) return; - NSString *filename = nil; - if (_kv.type != YYKVStorageTypeSQLite) { - if (value.length > _inlineThreshold) { - filename = [self _filenameForKey:key]; - } +/// String's md5 hash. +private func YYNSStringMD5(string: String?) -> String? { + if string == nil { + return nil } - - Lock(); - [_kv saveItemWithKey:key value:value filename:filename extendedData:extendedData]; - Unlock(); -} - -- (void)setObject:(id)object forKey:(NSString *)key withBlock:(void(^)(void))block { - __weak typeof(self) _self = self; - dispatch_async(_queue, ^{ - __strong typeof(_self) self = _self; - [self setObject:object forKey:key]; - if (block) block(); - }); -} - -- (void)removeObjectForKey:(NSString *)key { - if (!key) return; - Lock(); - [_kv removeItemForKey:key]; - Unlock(); -} - -- (void)removeObjectForKey:(NSString *)key withBlock:(void(^)(NSString *key))block { - __weak typeof(self) _self = self; - dispatch_async(_queue, ^{ - __strong typeof(_self) self = _self; - [self removeObjectForKey:key]; - if (block) block(key); - }); -} - -- (void)removeAllObjects { - Lock(); - [_kv removeAllItems]; - Unlock(); -} - -- (void)removeAllObjectsWithBlock:(void(^)(void))block { - __weak typeof(self) _self = self; - dispatch_async(_queue, ^{ - __strong typeof(_self) self = _self; - [self removeAllObjects]; - if (block) block(); - }); -} - -- (void)removeAllObjectsWithProgressBlock:(void(^)(int removedCount, int totalCount))progress - endBlock:(void(^)(BOOL error))end { - __weak typeof(self) _self = self; - dispatch_async(_queue, ^{ - __strong typeof(_self) self = _self; - if (!self) { - if (end) end(YES); - return; - } - Lock(); - [_kv removeAllItemsWithProgressBlock:progress endBlock:end]; - Unlock(); - }); -} - -- (NSInteger)totalCount { - Lock(); - int count = [_kv getItemsCount]; - Unlock(); - return count; -} - -- (void)totalCountWithBlock:(void(^)(NSInteger totalCount))block { - if (!block) return; - __weak typeof(self) _self = self; - dispatch_async(_queue, ^{ - __strong typeof(_self) self = _self; - NSInteger totalCount = [self totalCount]; - block(totalCount); - }); -} - -- (NSInteger)totalCost { - Lock(); - int count = [_kv getItemsSize]; - Unlock(); - return count; -} - -- (void)totalCostWithBlock:(void(^)(NSInteger totalCost))block { - if (!block) return; - __weak typeof(self) _self = self; - dispatch_async(_queue, ^{ - __strong typeof(_self) self = _self; - NSInteger totalCost = [self totalCost]; - block(totalCost); - }); -} - -- (void)trimToCount:(NSUInteger)count { - Lock(); - [self _trimToCount:count]; - Unlock(); -} - -- (void)trimToCount:(NSUInteger)count withBlock:(void(^)(void))block { - __weak typeof(self) _self = self; - dispatch_async(_queue, ^{ - __strong typeof(_self) self = _self; - [self trimToCount:count]; - if (block) block(); - }); -} - -- (void)trimToCost:(NSUInteger)cost { - Lock(); - [self _trimToCost:cost]; - Unlock(); -} - -- (void)trimToCost:(NSUInteger)cost withBlock:(void(^)(void))block { - __weak typeof(self) _self = self; - dispatch_async(_queue, ^{ - __strong typeof(_self) self = _self; - [self trimToCost:cost]; - if (block) block(); - }); -} - -- (void)trimToAge:(NSTimeInterval)age { - Lock(); - [self _trimToAge:age]; - Unlock(); -} - -- (void)trimToAge:(NSTimeInterval)age withBlock:(void(^)(void))block { - __weak typeof(self) _self = self; - dispatch_async(_queue, ^{ - __strong typeof(_self) self = _self; - [self trimToAge:age]; - if (block) block(); - }); -} - -+ (NSData *)getExtendedDataFromObject:(id)object { - if (!object) return nil; - return (NSData *)objc_getAssociatedObject(object, &extended_data_key); -} - -+ (void)setExtendedData:(NSData *)extendedData toObject:(id)object { - if (!object) return; - objc_setAssociatedObject(object, &extended_data_key, extendedData, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (NSString *)description { - if (_name) return [NSString stringWithFormat:@"<%@: %p> (%@:%@)", self.class, self, _name, _path]; - else return [NSString stringWithFormat:@"<%@: %p> (%@)", self.class, self, _path]; -} - -- (BOOL)errorLogsEnabled { - Lock(); - BOOL enabled = _kv.errorLogsEnabled; - Unlock(); - return enabled; -} - -- (void)setErrorLogsEnabled:(BOOL)errorLogsEnabled { - Lock(); - _kv.errorLogsEnabled = errorLogsEnabled; - Unlock(); -} - -@end + let data: Data? = string?.data(using: .utf8) + let result = [UInt8](repeating: 0, count: CC_MD5_DIGEST_LENGTH) + CC_MD5(data?.bytes, (data?.count ?? 0) as? CC_LONG, result) + return String(format: "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7], result[8], result[9], result[10], result[11], result[12], result[13], result[14], result[15]) +} +private func YYDiskCacheInitGlobal() { + // TODO: [Swiftify] ensure that the code below is executed only once (`dispatch_once()` is deprecated) + { + globalInstancesLock = DispatchSemaphore(value: 1) + globalInstances = NSMapTable(keyOptions: .strongMemory, valueOptions: .weakMemory, capacity: 0) +// +// The converted code is limited to 2 KB. +// Upgrade your plan to remove this limitation. +// +// %< ----------------------------------------------------------------------------------------- %< From 0160c09c63b69ea8e3b3b4166eb382cefa7a079a Mon Sep 17 00:00:00 2001 From: lztbwlkj Date: Fri, 14 Dec 2018 11:53:33 +0800 Subject: [PATCH 5/5] no message --- .../UserInterfaceState.xcuserstate | Bin 35086 -> 35542 bytes README.md | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/PPNetworkHelper.xcodeproj/project.xcworkspace/xcuserdata/GSTB.xcuserdatad/UserInterfaceState.xcuserstate b/PPNetworkHelper.xcodeproj/project.xcworkspace/xcuserdata/GSTB.xcuserdatad/UserInterfaceState.xcuserstate index 85ebc18dbbbe905512f7da1fb9ef315e0e358019..5abf656cda4589363194904f72d68d4ebb1e01dd 100644 GIT binary patch delta 17686 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 delta 17495 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