Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MSNetwork

基于AFNetworking 4.x与YYCache的二次封装,包括网络请求、文件上传、文件下载这三个方法。并且支持RESTful API,GET、POST、HEAD、PUT、DELETE、PATCH的请求,方法接口简洁明了,并结合YYCache做了网络数据的缓存策略。简单易用,一句代码搞定网络数据的请求与缓存,控制台可直接打印json中文字符,调试更方便

效果图

请求方式缓存策略文件下载文件上传

暂未测试

Requirements 要求

  • iOS 9+
  • Xcode 10+

安装!

Cocoapods安装

 pod 'MSNetwork'

手动安装

注意: 项目中需要有AFN 4.x , YYCache第三方库! 在工程中链接sqlite3依赖库

1、下载Demo后将MSNetwork文件夹添加到项目目录中;
2、创建并配置PrefixHeader.pch文件或者导入头文件MSNetwork.h开始使用即可;

Usage 使用方法

所有方法都可以直接看 MSNetwork.h 中的声明以及注释。

MSNetwork 的全局配置

设置日志

关于日志打印
//开启日志打印 默认打开(Debug级别)
[MSNetwork openLog];
//关闭日志打印,
[MSNetwork closeLog];

设置请求根路径

//最终完整Url为[NSString stringWithFormat:@“%@%@”,_baseURL,URL],
[MSNetwork setBaseURL:@"https://www.baidu.com/"];

设置缓存过滤参数key(如时间戳,随机数)否则会导致无法得到缓存数据

[MSNetwork setFiltrationCacheKey:@[@"2",@"3"]];

设置全局请求参数

NSDictionary *dic = @{@"accountToken":@{@"clientType":@"",@"tokenKey":@""}};
[MSNetwork setBaseParameters:dic];

设置网络请求超时时间

[MSNetwork setRequestTimeoutInterval:15.0f];

设置网络请求头

//可一次设置多个也可单独设置//[MSNetwork setHeadr:@{@"api-version":@"v1.0.0"}];
[MSNetwork setValue:@"9"forHTTPHeaderField:@"fromType"];

网络状态

网络状态监听

[MSNetwork networkStatusWithBlock:^(MSNetworkStatusType status) {
switch (status) {
case MSNetworkStatusUnknown:
//未知网络break;
case MSNetworkStatusNotReachable:
//无网路break;
case MSNetworkStatusReachableWWAN:
//手机网络break;
case MSNetworkStatusReachableWiFi:
//WiFi网络break;
default:
break;
}
}];

判断有无网络

if (kIsNetwork) {
NSLog(@"有网络");
if (kIsWWANNetwork) {
NSLog(@"手机网络");
}elseif (kIsWiFiNetwork){
NSLog(@"WiFi网络");
}
} else {
NSLog(@"无网络");
}
//// if ([MSNetwork isNetwork]) {// NSLog(@"有网络");// if ([MSNetwork isWWANNetwork]) {// NSLog(@"手机网络");// }else if ([MSNetwork isWiFiNetwork]){// NSLog(@"WiFi网络");// }// } else {// NSLog(@"无网络");// }

网络缓存

缓存策略

这是我目前能想到的几个缓存场景

  • 只从网络获取数据,且数据不会缓存在本地(一般情况)
  • 从缓存读取数据并返回,再从网络获取并缓存,每次只读取缓存数据(一般用于广告页面可提高加载速度)
  • 先从网络获取数据并缓存数据,如果访问网络失败再从缓存读取,失败的Block和成功的Block都会执行(如果有更好的建议可以告诉我)
  • 先从缓存读取数据,然后在从网络获取并且缓存,在这种情况下,Block将产生两次调用(如果有更好的建议可以告诉我)
typedefNS_ENUM(NSUInteger, MSCachePolicy){
/**只从网络获取数据,且数据不会缓存在本地**/
MSCachePolicyOnlyNetNoCache = 0,
/** 从缓存读取数据并返回,再从网络获取并缓存,每次只读取缓存数据**/
MSCachePolicyCacheElseNet,
/** 先从网络获取数据并缓存数据,如果访问网络失败再从缓存读取,失败的Block和成功的Block都会执行*/
MSCachePolicyNetElseCache,
/**先从缓存读取数据,然后在从网络获取并且缓存,在这种情况下,缓存数据与网络数据不一致Block将产生两次调用*/
MSCachePolicyCacheThenNet
};

缓存大小

CGFloat totalBytes = [MSNetwork getAllHttpCacheSize]/1024.f;
NSLog(@"网络缓存大小cache = %fKB",totalBytes);
//或者
[MSNetwork getAllHttpCacheSizeBlock:^(NSInteger totalCount) {
NSLog(@"网络缓存大小cache = %.2fMB",totalCount/1024/1024.f);
}];

删除网络缓存

__weak __typeof(&*self)weakSelf = self;
[MSNetwork removeAllHttpCacheBlock:^(int removedCount, int totalCount) {
NSLog(@"cache progress = %d",removedCount/totalCount);
} endBlock:^(BOOL error) {
//通知主线程刷新dispatch_async(dispatch_get_main_queue(), ^{
});
}]; //或者// [MSNetwork removeAllHttpCache];

网络请求

GET

__weak __typeof(&*self)weakSelf = self;
NSDictionary *para = @{@"a":@"list", @"c":@"data",@"client":@"iphone",@"page":@"0",@"per":@"10", @"type":@"29"};
[MSHTTPRequest GET:@""parameters:para cachePolicy:MSCachePolicyCacheThenNet success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

POST

__weak __typeof(&*self)weakSelf = self;
[MSHTTPRequest POST:@""parameters:@{} cachePolicy:MSCachePolicyCacheThenNet success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

其他请求方式(HEAD、PUT、DELETE、PATCH)

HEAD、PUT、DELETE、PATCH请求方式和GET、POST方式类似,请前往MSNetwork.h文件中查看对应方法(相信聪明的你一看就明白了!~ Q.Q ~)

自定义请求方式

[MSNetwork HTTPWithMethod:@""url:@""parameters:@{} cachePolicy:设置缓存策略的枚举 success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

文件下载

- (void)downLoadFiles {
MBProgressHUD *hud = [MBProgressHUD mb_showBar:@"正在下载..."detailMsg:@"请不要退出程序,以免下载失败!"onView:nilhideBlock:^{
NSLog(@"hud已经隐藏");
}];
NSURLSessionTask *task = [MSNetwork downloadWithURL:@""fileDir:@"下载至沙盒中的制定文件夹(默认为Download)"progress:^(NSProgress * _Nonnull progress) {
CGFloat stauts = 100.f * progress.completedUnitCount/progress.totalUnitCount;
CGFloat pro = stauts/100.f;
NSLog(@"pro = %.2f",pro);
hud.progress = pro;
//此处只用于Demo演示,展示不同状态的hudif (pro >= 0.5) {
hud.mode = MBProgressHUDModeAnnularDeterminate;
}
if (pro == 1.0) {
UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
hud.customView = imageView;
hud.mode = MBProgressHUDModeCustomView;
hud.label.text = NSLocalizedString(@"下载完成", @"HUD completed title");
hud.detailsLabel.text = @"";
[hud hideAnimated:YESafterDelay:1.5];
}
} success:^(NSString * _Nonnull path) {
} failure:^(NSError * _Nonnull error) {
}];
}
//暂停下载,暂不支持断点下载
[task suspend];
//开始下载
[task resume];

文件上传

NSURLSessionTask *task = [MSNetwork uploadFileWithURL:@""parameters:@{@"参数":@"参数"}
name:@"文件对应服务器上的字段"filePath:@"文件本地的沙盒路径"progress:^(NSProgress *progress) {
//上传进度NSLog(@"上传进度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
} success:^(id responseObject) {
//上传成功
} failure:^(NSError *error) {
//上传失败
}];

单/多图上传

NSURLSessionTask *task = [MSNetwork uploadImageURL:@""parameters:@{} images:@[@"图片类型数组"] name:@"文件对应服务器上的字段"fileName:@"图片名称"imageScale:0.5imageType:@"png\jpg\jpeg..."progress:^(NSProgress * _Nonnull progress) {
//上传进度NSLog(@"上传进度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
} success:^(id _Nonnull responseObject) {
//上传成功
} failure:^(NSError * _Nonnull error) {
//上传失败
}];

重置AFHTTPSessionManager相关属性

#pragma mark - 设置AFHTTPSessionManager相关属性
#pragma mark 注意: 因为全局只有一个AFHTTPSessionManager实例,所以以下设置方式全局生效
/**在开发中,如果以下的设置方式不满足项目的需求,就调用此方法获取AFHTTPSessionManager实例进行自定义设置(注意: 调用此方法时在要导入AFNetworking.h头文件,否则可能会报找不到AFHTTPSessionManager的❌)@param sessionManager AFHTTPSessionManager的实例*/
+ (void)setAFHTTPSessionManagerProperty:(void(^)(AFHTTPSessionManager *sessionManager))sessionManager;
/**设置网络请求参数的格式:默认为JSON格式@param requestSerializer MSRequestSerializerJSON---JSON格式 MSRequestSerializerHTTP--HTTP*/
+ (void)setRequestSerializer:(MSRequestSerializer)requestSerializer;
/**设置服务器响应数据格式:默认为JSON格式@param responseSerializer MSResponseSerializerJSON---JSON格式 MSResponseSerializerHTTP--HTTP*/
+ (void)setResponseSerializer:(MSResponseSerializer)responseSerializer;
/**设置请求头*/
+ (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
/**配置自建证书的Https请求,参考链接:http://blog.csdn.net/syg90178aw/article/details/52839103@param cerPath 自建https证书路径@param validatesDomainName 是否验证域名(默认YES) 如果证书的域名与请求的域名不一致,需设置为NO服务器使用其他信任机构颁发的证书也可以建立连接,但这个非常危险,建议打开 .validatesDomainName=NO,主要用于这种情况:客户端请求的是子域名,而证书上是另外一个域名。因为SSL证书上的域名是独立的For example:证书注册的域名是www.baidu.com,那么mail.baidu.com是无法验证通过的*/
+ (void)setSecurityPolicyWithCerPath:(NSString *)cerPath validatesDomainName:(BOOL)validatesDomainName;

MSNetwork全部以类方法调用,使用简单,麻麻再也不用担心我一句一句地写SQLite啦~~~

如果关于缓存策略你有更好的建议或者思路,希望留言告知!不吝赐教!

万水千山总是情,给个Start行不行!!!~ Q.Q ~

About

基于AFNetworking 4.x与YYCache的二次封装,包括网络请求、文件上传、文件下载这三个方法。并且支持RESTful API,GET、POST、HEAD、PUT、DELETE、PATCH的请求,方法接口简洁明了,并结合YYCache做了网络数据的缓存策略。简单易用,一句代码搞定网络数据的请求与缓存,控制台可直接打印json中文字符,调试更方便

Topics

Resources

Stars

35 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MSNetwork

基于AFNetworking 4.x与YYCache的二次封装,包括网络请求、文件上传、文件下载这三个方法。并且支持RESTful API,GET、POST、HEAD、PUT、DELETE、PATCH的请求,方法接口简洁明了,并结合YYCache做了网络数据的缓存策略。简单易用,一句代码搞定网络数据的请求与缓存,控制台可直接打印json中文字符,调试更方便

效果图

请求方式缓存策略文件下载文件上传

暂未测试

Requirements 要求

  • iOS 9+
  • Xcode 10+

安装!

Cocoapods安装

 pod 'MSNetwork'

手动安装

注意: 项目中需要有AFN 4.x , YYCache第三方库! 在工程中链接sqlite3依赖库

1、下载Demo后将MSNetwork文件夹添加到项目目录中;
2、创建并配置PrefixHeader.pch文件或者导入头文件MSNetwork.h开始使用即可;

Usage 使用方法

所有方法都可以直接看 MSNetwork.h 中的声明以及注释。

MSNetwork 的全局配置

设置日志

关于日志打印
//开启日志打印 默认打开(Debug级别)
[MSNetwork openLog];
//关闭日志打印,
[MSNetwork closeLog];

设置请求根路径

//最终完整Url为[NSString stringWithFormat:@“%@%@”,_baseURL,URL],
[MSNetwork setBaseURL:@"https://www.baidu.com/"];

设置缓存过滤参数key(如时间戳,随机数)否则会导致无法得到缓存数据

[MSNetwork setFiltrationCacheKey:@[@"2",@"3"]];

设置全局请求参数

NSDictionary *dic = @{@"accountToken":@{@"clientType":@"",@"tokenKey":@""}};
[MSNetwork setBaseParameters:dic];

设置网络请求超时时间

[MSNetwork setRequestTimeoutInterval:15.0f];

设置网络请求头

//可一次设置多个也可单独设置//[MSNetwork setHeadr:@{@"api-version":@"v1.0.0"}];
[MSNetwork setValue:@"9"forHTTPHeaderField:@"fromType"];

网络状态

网络状态监听

[MSNetwork networkStatusWithBlock:^(MSNetworkStatusType status) {
switch (status) {
case MSNetworkStatusUnknown:
//未知网络break;
case MSNetworkStatusNotReachable:
//无网路break;
case MSNetworkStatusReachableWWAN:
//手机网络break;
case MSNetworkStatusReachableWiFi:
//WiFi网络break;
default:
break;
}
}];

判断有无网络

if (kIsNetwork) {
NSLog(@"有网络");
if (kIsWWANNetwork) {
NSLog(@"手机网络");
}elseif (kIsWiFiNetwork){
NSLog(@"WiFi网络");
}
} else {
NSLog(@"无网络");
}
//// if ([MSNetwork isNetwork]) {// NSLog(@"有网络");// if ([MSNetwork isWWANNetwork]) {// NSLog(@"手机网络");// }else if ([MSNetwork isWiFiNetwork]){// NSLog(@"WiFi网络");// }// } else {// NSLog(@"无网络");// }

网络缓存

缓存策略

这是我目前能想到的几个缓存场景

  • 只从网络获取数据,且数据不会缓存在本地(一般情况)
  • 从缓存读取数据并返回,再从网络获取并缓存,每次只读取缓存数据(一般用于广告页面可提高加载速度)
  • 先从网络获取数据并缓存数据,如果访问网络失败再从缓存读取,失败的Block和成功的Block都会执行(如果有更好的建议可以告诉我)
  • 先从缓存读取数据,然后在从网络获取并且缓存,在这种情况下,Block将产生两次调用(如果有更好的建议可以告诉我)
typedefNS_ENUM(NSUInteger, MSCachePolicy){
/**只从网络获取数据,且数据不会缓存在本地**/
MSCachePolicyOnlyNetNoCache = 0,
/** 从缓存读取数据并返回,再从网络获取并缓存,每次只读取缓存数据**/
MSCachePolicyCacheElseNet,
/** 先从网络获取数据并缓存数据,如果访问网络失败再从缓存读取,失败的Block和成功的Block都会执行*/
MSCachePolicyNetElseCache,
/**先从缓存读取数据,然后在从网络获取并且缓存,在这种情况下,缓存数据与网络数据不一致Block将产生两次调用*/
MSCachePolicyCacheThenNet
};

缓存大小

CGFloat totalBytes = [MSNetwork getAllHttpCacheSize]/1024.f;
NSLog(@"网络缓存大小cache = %fKB",totalBytes);
//或者
[MSNetwork getAllHttpCacheSizeBlock:^(NSInteger totalCount) {
NSLog(@"网络缓存大小cache = %.2fMB",totalCount/1024/1024.f);
}];

删除网络缓存

__weak __typeof(&*self)weakSelf = self;
[MSNetwork removeAllHttpCacheBlock:^(int removedCount, int totalCount) {
NSLog(@"cache progress = %d",removedCount/totalCount);
} endBlock:^(BOOL error) {
//通知主线程刷新dispatch_async(dispatch_get_main_queue(), ^{
});
}]; //或者// [MSNetwork removeAllHttpCache];

网络请求

GET

__weak __typeof(&*self)weakSelf = self;
NSDictionary *para = @{@"a":@"list", @"c":@"data",@"client":@"iphone",@"page":@"0",@"per":@"10", @"type":@"29"};
[MSHTTPRequest GET:@""parameters:para cachePolicy:MSCachePolicyCacheThenNet success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

POST

__weak __typeof(&*self)weakSelf = self;
[MSHTTPRequest POST:@""parameters:@{} cachePolicy:MSCachePolicyCacheThenNet success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

其他请求方式(HEAD、PUT、DELETE、PATCH)

HEAD、PUT、DELETE、PATCH请求方式和GET、POST方式类似,请前往MSNetwork.h文件中查看对应方法(相信聪明的你一看就明白了!~ Q.Q ~)

自定义请求方式

[MSNetwork HTTPWithMethod:@""url:@""parameters:@{} cachePolicy:设置缓存策略的枚举 success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

文件下载

- (void)downLoadFiles {
MBProgressHUD *hud = [MBProgressHUD mb_showBar:@"正在下载..."detailMsg:@"请不要退出程序,以免下载失败!"onView:nilhideBlock:^{
NSLog(@"hud已经隐藏");
}];
NSURLSessionTask *task = [MSNetwork downloadWithURL:@""fileDir:@"下载至沙盒中的制定文件夹(默认为Download)"progress:^(NSProgress * _Nonnull progress) {
CGFloat stauts = 100.f * progress.completedUnitCount/progress.totalUnitCount;
CGFloat pro = stauts/100.f;
NSLog(@"pro = %.2f",pro);
hud.progress = pro;
//此处只用于Demo演示,展示不同状态的hudif (pro >= 0.5) {
hud.mode = MBProgressHUDModeAnnularDeterminate;
}
if (pro == 1.0) {
UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
hud.customView = imageView;
hud.mode = MBProgressHUDModeCustomView;
hud.label.text = NSLocalizedString(@"下载完成", @"HUD completed title");
hud.detailsLabel.text = @"";
[hud hideAnimated:YESafterDelay:1.5];
}
} success:^(NSString * _Nonnull path) {
} failure:^(NSError * _Nonnull error) {
}];
}
//暂停下载,暂不支持断点下载
[task suspend];
//开始下载
[task resume];

文件上传

NSURLSessionTask *task = [MSNetwork uploadFileWithURL:@""parameters:@{@"参数":@"参数"}
name:@"文件对应服务器上的字段"filePath:@"文件本地的沙盒路径"progress:^(NSProgress *progress) {
//上传进度NSLog(@"上传进度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
} success:^(id responseObject) {
//上传成功
} failure:^(NSError *error) {
//上传失败
}];

单/多图上传

NSURLSessionTask *task = [MSNetwork uploadImageURL:@""parameters:@{} images:@[@"图片类型数组"] name:@"文件对应服务器上的字段"fileName:@"图片名称"imageScale:0.5imageType:@"png\jpg\jpeg..."progress:^(NSProgress * _Nonnull progress) {
//上传进度NSLog(@"上传进度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
} success:^(id _Nonnull responseObject) {
//上传成功
} failure:^(NSError * _Nonnull error) {
//上传失败
}];

重置AFHTTPSessionManager相关属性

#pragma mark - 设置AFHTTPSessionManager相关属性
#pragma mark 注意: 因为全局只有一个AFHTTPSessionManager实例,所以以下设置方式全局生效
/**在开发中,如果以下的设置方式不满足项目的需求,就调用此方法获取AFHTTPSessionManager实例进行自定义设置(注意: 调用此方法时在要导入AFNetworking.h头文件,否则可能会报找不到AFHTTPSessionManager的❌)@param sessionManager AFHTTPSessionManager的实例*/
+ (void)setAFHTTPSessionManagerProperty:(void(^)(AFHTTPSessionManager *sessionManager))sessionManager;
/**设置网络请求参数的格式:默认为JSON格式@param requestSerializer MSRequestSerializerJSON---JSON格式 MSRequestSerializerHTTP--HTTP*/
+ (void)setRequestSerializer:(MSRequestSerializer)requestSerializer;
/**设置服务器响应数据格式:默认为JSON格式@param responseSerializer MSResponseSerializerJSON---JSON格式 MSResponseSerializerHTTP--HTTP*/
+ (void)setResponseSerializer:(MSResponseSerializer)responseSerializer;
/**设置请求头*/
+ (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
/**配置自建证书的Https请求,参考链接:http://blog.csdn.net/syg90178aw/article/details/52839103@param cerPath 自建https证书路径@param validatesDomainName 是否验证域名(默认YES) 如果证书的域名与请求的域名不一致,需设置为NO服务器使用其他信任机构颁发的证书也可以建立连接,但这个非常危险,建议打开 .validatesDomainName=NO,主要用于这种情况:客户端请求的是子域名,而证书上是另外一个域名。因为SSL证书上的域名是独立的For example:证书注册的域名是www.baidu.com,那么mail.baidu.com是无法验证通过的*/
+ (void)setSecurityPolicyWithCerPath:(NSString *)cerPath validatesDomainName:(BOOL)validatesDomainName;

MSNetwork全部以类方法调用,使用简单,麻麻再也不用担心我一句一句地写SQLite啦~~~

如果关于缓存策略你有更好的建议或者思路,希望留言告知!不吝赐教!

万水千山总是情,给个Start行不行!!!~ Q.Q ~

About

基于AFNetworking 4.x与YYCache的二次封装,包括网络请求、文件上传、文件下载这三个方法。并且支持RESTful API,GET、POST、HEAD、PUT、DELETE、PATCH的请求,方法接口简洁明了,并结合YYCache做了网络数据的缓存策略。简单易用,一句代码搞定网络数据的请求与缓存,控制台可直接打印json中文字符,调试更方便

Topics

Resources

Stars

35 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MSNetwork

基于AFNetworking 4.x与YYCache的二次封装,包括网络请求、文件上传、文件下载这三个方法。并且支持RESTful API,GET、POST、HEAD、PUT、DELETE、PATCH的请求,方法接口简洁明了,并结合YYCache做了网络数据的缓存策略。简单易用,一句代码搞定网络数据的请求与缓存,控制台可直接打印json中文字符,调试更方便

效果图

请求方式缓存策略文件下载文件上传

暂未测试

Requirements 要求

  • iOS 9+
  • Xcode 10+

安装!

Cocoapods安装

 pod 'MSNetwork'

手动安装

注意: 项目中需要有AFN 4.x , YYCache第三方库! 在工程中链接sqlite3依赖库

1、下载Demo后将MSNetwork文件夹添加到项目目录中;
2、创建并配置PrefixHeader.pch文件或者导入头文件MSNetwork.h开始使用即可;

Usage 使用方法

所有方法都可以直接看 MSNetwork.h 中的声明以及注释。

MSNetwork 的全局配置

设置日志

关于日志打印
//开启日志打印 默认打开(Debug级别)
[MSNetwork openLog];
//关闭日志打印,
[MSNetwork closeLog];

设置请求根路径

//最终完整Url为[NSString stringWithFormat:@“%@%@”,_baseURL,URL],
[MSNetwork setBaseURL:@"https://www.baidu.com/"];

设置缓存过滤参数key(如时间戳,随机数)否则会导致无法得到缓存数据

[MSNetwork setFiltrationCacheKey:@[@"2",@"3"]];

设置全局请求参数

NSDictionary *dic = @{@"accountToken":@{@"clientType":@"",@"tokenKey":@""}};
[MSNetwork setBaseParameters:dic];

设置网络请求超时时间

[MSNetwork setRequestTimeoutInterval:15.0f];

设置网络请求头

//可一次设置多个也可单独设置//[MSNetwork setHeadr:@{@"api-version":@"v1.0.0"}];
[MSNetwork setValue:@"9"forHTTPHeaderField:@"fromType"];

网络状态

网络状态监听

[MSNetwork networkStatusWithBlock:^(MSNetworkStatusType status) {
switch (status) {
case MSNetworkStatusUnknown:
//未知网络break;
case MSNetworkStatusNotReachable:
//无网路break;
case MSNetworkStatusReachableWWAN:
//手机网络break;
case MSNetworkStatusReachableWiFi:
//WiFi网络break;
default:
break;
}
}];

判断有无网络

if (kIsNetwork) {
NSLog(@"有网络");
if (kIsWWANNetwork) {
NSLog(@"手机网络");
}elseif (kIsWiFiNetwork){
NSLog(@"WiFi网络");
}
} else {
NSLog(@"无网络");
}
//// if ([MSNetwork isNetwork]) {// NSLog(@"有网络");// if ([MSNetwork isWWANNetwork]) {// NSLog(@"手机网络");// }else if ([MSNetwork isWiFiNetwork]){// NSLog(@"WiFi网络");// }// } else {// NSLog(@"无网络");// }

网络缓存

缓存策略

这是我目前能想到的几个缓存场景

  • 只从网络获取数据,且数据不会缓存在本地(一般情况)
  • 从缓存读取数据并返回,再从网络获取并缓存,每次只读取缓存数据(一般用于广告页面可提高加载速度)
  • 先从网络获取数据并缓存数据,如果访问网络失败再从缓存读取,失败的Block和成功的Block都会执行(如果有更好的建议可以告诉我)
  • 先从缓存读取数据,然后在从网络获取并且缓存,在这种情况下,Block将产生两次调用(如果有更好的建议可以告诉我)
typedefNS_ENUM(NSUInteger, MSCachePolicy){
/**只从网络获取数据,且数据不会缓存在本地**/
MSCachePolicyOnlyNetNoCache = 0,
/** 从缓存读取数据并返回,再从网络获取并缓存,每次只读取缓存数据**/
MSCachePolicyCacheElseNet,
/** 先从网络获取数据并缓存数据,如果访问网络失败再从缓存读取,失败的Block和成功的Block都会执行*/
MSCachePolicyNetElseCache,
/**先从缓存读取数据,然后在从网络获取并且缓存,在这种情况下,缓存数据与网络数据不一致Block将产生两次调用*/
MSCachePolicyCacheThenNet
};

缓存大小

CGFloat totalBytes = [MSNetwork getAllHttpCacheSize]/1024.f;
NSLog(@"网络缓存大小cache = %fKB",totalBytes);
//或者
[MSNetwork getAllHttpCacheSizeBlock:^(NSInteger totalCount) {
NSLog(@"网络缓存大小cache = %.2fMB",totalCount/1024/1024.f);
}];

删除网络缓存

__weak __typeof(&*self)weakSelf = self;
[MSNetwork removeAllHttpCacheBlock:^(int removedCount, int totalCount) {
NSLog(@"cache progress = %d",removedCount/totalCount);
} endBlock:^(BOOL error) {
//通知主线程刷新dispatch_async(dispatch_get_main_queue(), ^{
});
}]; //或者// [MSNetwork removeAllHttpCache];

网络请求

GET

__weak __typeof(&*self)weakSelf = self;
NSDictionary *para = @{@"a":@"list", @"c":@"data",@"client":@"iphone",@"page":@"0",@"per":@"10", @"type":@"29"};
[MSHTTPRequest GET:@""parameters:para cachePolicy:MSCachePolicyCacheThenNet success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

POST

__weak __typeof(&*self)weakSelf = self;
[MSHTTPRequest POST:@""parameters:@{} cachePolicy:MSCachePolicyCacheThenNet success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

其他请求方式(HEAD、PUT、DELETE、PATCH)

HEAD、PUT、DELETE、PATCH请求方式和GET、POST方式类似,请前往MSNetwork.h文件中查看对应方法(相信聪明的你一看就明白了!~ Q.Q ~)

自定义请求方式

[MSNetwork HTTPWithMethod:@""url:@""parameters:@{} cachePolicy:设置缓存策略的枚举 success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

文件下载

- (void)downLoadFiles {
MBProgressHUD *hud = [MBProgressHUD mb_showBar:@"正在下载..."detailMsg:@"请不要退出程序,以免下载失败!"onView:nilhideBlock:^{
NSLog(@"hud已经隐藏");
}];
NSURLSessionTask *task = [MSNetwork downloadWithURL:@""fileDir:@"下载至沙盒中的制定文件夹(默认为Download)"progress:^(NSProgress * _Nonnull progress) {
CGFloat stauts = 100.f * progress.completedUnitCount/progress.totalUnitCount;
CGFloat pro = stauts/100.f;
NSLog(@"pro = %.2f",pro);
hud.progress = pro;
//此处只用于Demo演示,展示不同状态的hudif (pro >= 0.5) {
hud.mode = MBProgressHUDModeAnnularDeterminate;
}
if (pro == 1.0) {
UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
hud.customView = imageView;
hud.mode = MBProgressHUDModeCustomView;
hud.label.text = NSLocalizedString(@"下载完成", @"HUD completed title");
hud.detailsLabel.text = @"";
[hud hideAnimated:YESafterDelay:1.5];
}
} success:^(NSString * _Nonnull path) {
} failure:^(NSError * _Nonnull error) {
}];
}
//暂停下载,暂不支持断点下载
[task suspend];
//开始下载
[task resume];

文件上传

NSURLSessionTask *task = [MSNetwork uploadFileWithURL:@""parameters:@{@"参数":@"参数"}
name:@"文件对应服务器上的字段"filePath:@"文件本地的沙盒路径"progress:^(NSProgress *progress) {
//上传进度NSLog(@"上传进度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
} success:^(id responseObject) {
//上传成功
} failure:^(NSError *error) {
//上传失败
}];

单/多图上传

NSURLSessionTask *task = [MSNetwork uploadImageURL:@""parameters:@{} images:@[@"图片类型数组"] name:@"文件对应服务器上的字段"fileName:@"图片名称"imageScale:0.5imageType:@"png\jpg\jpeg..."progress:^(NSProgress * _Nonnull progress) {
//上传进度NSLog(@"上传进度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
} success:^(id _Nonnull responseObject) {
//上传成功
} failure:^(NSError * _Nonnull error) {
//上传失败
}];

重置AFHTTPSessionManager相关属性

#pragma mark - 设置AFHTTPSessionManager相关属性
#pragma mark 注意: 因为全局只有一个AFHTTPSessionManager实例,所以以下设置方式全局生效
/**在开发中,如果以下的设置方式不满足项目的需求,就调用此方法获取AFHTTPSessionManager实例进行自定义设置(注意: 调用此方法时在要导入AFNetworking.h头文件,否则可能会报找不到AFHTTPSessionManager的❌)@param sessionManager AFHTTPSessionManager的实例*/
+ (void)setAFHTTPSessionManagerProperty:(void(^)(AFHTTPSessionManager *sessionManager))sessionManager;
/**设置网络请求参数的格式:默认为JSON格式@param requestSerializer MSRequestSerializerJSON---JSON格式 MSRequestSerializerHTTP--HTTP*/
+ (void)setRequestSerializer:(MSRequestSerializer)requestSerializer;
/**设置服务器响应数据格式:默认为JSON格式@param responseSerializer MSResponseSerializerJSON---JSON格式 MSResponseSerializerHTTP--HTTP*/
+ (void)setResponseSerializer:(MSResponseSerializer)responseSerializer;
/**设置请求头*/
+ (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
/**配置自建证书的Https请求,参考链接:http://blog.csdn.net/syg90178aw/article/details/52839103@param cerPath 自建https证书路径@param validatesDomainName 是否验证域名(默认YES) 如果证书的域名与请求的域名不一致,需设置为NO服务器使用其他信任机构颁发的证书也可以建立连接,但这个非常危险,建议打开 .validatesDomainName=NO,主要用于这种情况:客户端请求的是子域名,而证书上是另外一个域名。因为SSL证书上的域名是独立的For example:证书注册的域名是www.baidu.com,那么mail.baidu.com是无法验证通过的*/
+ (void)setSecurityPolicyWithCerPath:(NSString *)cerPath validatesDomainName:(BOOL)validatesDomainName;

MSNetwork全部以类方法调用,使用简单,麻麻再也不用担心我一句一句地写SQLite啦~~~

如果关于缓存策略你有更好的建议或者思路,希望留言告知!不吝赐教!

万水千山总是情,给个Start行不行!!!~ Q.Q ~

About

基于AFNetworking 4.x与YYCache的二次封装,包括网络请求、文件上传、文件下载这三个方法。并且支持RESTful API,GET、POST、HEAD、PUT、DELETE、PATCH的请求,方法接口简洁明了,并结合YYCache做了网络数据的缓存策略。简单易用,一句代码搞定网络数据的请求与缓存,控制台可直接打印json中文字符,调试更方便

Topics

Resources

Stars

35 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MSNetwork

基于AFNetworking 4.x与YYCache的二次封装,包括网络请求、文件上传、文件下载这三个方法。并且支持RESTful API,GET、POST、HEAD、PUT、DELETE、PATCH的请求,方法接口简洁明了,并结合YYCache做了网络数据的缓存策略。简单易用,一句代码搞定网络数据的请求与缓存,控制台可直接打印json中文字符,调试更方便

效果图

请求方式缓存策略文件下载文件上传

暂未测试

Requirements 要求

  • iOS 9+
  • Xcode 10+

安装!

Cocoapods安装

 pod 'MSNetwork'

手动安装

注意: 项目中需要有AFN 4.x , YYCache第三方库! 在工程中链接sqlite3依赖库

1、下载Demo后将MSNetwork文件夹添加到项目目录中;
2、创建并配置PrefixHeader.pch文件或者导入头文件MSNetwork.h开始使用即可;

Usage 使用方法

所有方法都可以直接看 MSNetwork.h 中的声明以及注释。

MSNetwork 的全局配置

设置日志

关于日志打印
//开启日志打印 默认打开(Debug级别)
[MSNetwork openLog];
//关闭日志打印,
[MSNetwork closeLog];

设置请求根路径

//最终完整Url为[NSString stringWithFormat:@“%@%@”,_baseURL,URL],
[MSNetwork setBaseURL:@"https://www.baidu.com/"];

设置缓存过滤参数key(如时间戳,随机数)否则会导致无法得到缓存数据

[MSNetwork setFiltrationCacheKey:@[@"2",@"3"]];

设置全局请求参数

NSDictionary *dic = @{@"accountToken":@{@"clientType":@"",@"tokenKey":@""}};
[MSNetwork setBaseParameters:dic];

设置网络请求超时时间

[MSNetwork setRequestTimeoutInterval:15.0f];

设置网络请求头

//可一次设置多个也可单独设置//[MSNetwork setHeadr:@{@"api-version":@"v1.0.0"}];
[MSNetwork setValue:@"9"forHTTPHeaderField:@"fromType"];

网络状态

网络状态监听

[MSNetwork networkStatusWithBlock:^(MSNetworkStatusType status) {
switch (status) {
case MSNetworkStatusUnknown:
//未知网络break;
case MSNetworkStatusNotReachable:
//无网路break;
case MSNetworkStatusReachableWWAN:
//手机网络break;
case MSNetworkStatusReachableWiFi:
//WiFi网络break;
default:
break;
}
}];

判断有无网络

if (kIsNetwork) {
NSLog(@"有网络");
if (kIsWWANNetwork) {
NSLog(@"手机网络");
}elseif (kIsWiFiNetwork){
NSLog(@"WiFi网络");
}
} else {
NSLog(@"无网络");
}
//// if ([MSNetwork isNetwork]) {// NSLog(@"有网络");// if ([MSNetwork isWWANNetwork]) {// NSLog(@"手机网络");// }else if ([MSNetwork isWiFiNetwork]){// NSLog(@"WiFi网络");// }// } else {// NSLog(@"无网络");// }

网络缓存

缓存策略

这是我目前能想到的几个缓存场景

  • 只从网络获取数据,且数据不会缓存在本地(一般情况)
  • 从缓存读取数据并返回,再从网络获取并缓存,每次只读取缓存数据(一般用于广告页面可提高加载速度)
  • 先从网络获取数据并缓存数据,如果访问网络失败再从缓存读取,失败的Block和成功的Block都会执行(如果有更好的建议可以告诉我)
  • 先从缓存读取数据,然后在从网络获取并且缓存,在这种情况下,Block将产生两次调用(如果有更好的建议可以告诉我)
typedefNS_ENUM(NSUInteger, MSCachePolicy){
/**只从网络获取数据,且数据不会缓存在本地**/
MSCachePolicyOnlyNetNoCache = 0,
/** 从缓存读取数据并返回,再从网络获取并缓存,每次只读取缓存数据**/
MSCachePolicyCacheElseNet,
/** 先从网络获取数据并缓存数据,如果访问网络失败再从缓存读取,失败的Block和成功的Block都会执行*/
MSCachePolicyNetElseCache,
/**先从缓存读取数据,然后在从网络获取并且缓存,在这种情况下,缓存数据与网络数据不一致Block将产生两次调用*/
MSCachePolicyCacheThenNet
};

缓存大小

CGFloat totalBytes = [MSNetwork getAllHttpCacheSize]/1024.f;
NSLog(@"网络缓存大小cache = %fKB",totalBytes);
//或者
[MSNetwork getAllHttpCacheSizeBlock:^(NSInteger totalCount) {
NSLog(@"网络缓存大小cache = %.2fMB",totalCount/1024/1024.f);
}];

删除网络缓存

__weak __typeof(&*self)weakSelf = self;
[MSNetwork removeAllHttpCacheBlock:^(int removedCount, int totalCount) {
NSLog(@"cache progress = %d",removedCount/totalCount);
} endBlock:^(BOOL error) {
//通知主线程刷新dispatch_async(dispatch_get_main_queue(), ^{
});
}]; //或者// [MSNetwork removeAllHttpCache];

网络请求

GET

__weak __typeof(&*self)weakSelf = self;
NSDictionary *para = @{@"a":@"list", @"c":@"data",@"client":@"iphone",@"page":@"0",@"per":@"10", @"type":@"29"};
[MSHTTPRequest GET:@""parameters:para cachePolicy:MSCachePolicyCacheThenNet success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

POST

__weak __typeof(&*self)weakSelf = self;
[MSHTTPRequest POST:@""parameters:@{} cachePolicy:MSCachePolicyCacheThenNet success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

其他请求方式(HEAD、PUT、DELETE、PATCH)

HEAD、PUT、DELETE、PATCH请求方式和GET、POST方式类似,请前往MSNetwork.h文件中查看对应方法(相信聪明的你一看就明白了!~ Q.Q ~)

自定义请求方式

[MSNetwork HTTPWithMethod:@""url:@""parameters:@{} cachePolicy:设置缓存策略的枚举 success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

文件下载

- (void)downLoadFiles {
MBProgressHUD *hud = [MBProgressHUD mb_showBar:@"正在下载..."detailMsg:@"请不要退出程序,以免下载失败!"onView:nilhideBlock:^{
NSLog(@"hud已经隐藏");
}];
NSURLSessionTask *task = [MSNetwork downloadWithURL:@""fileDir:@"下载至沙盒中的制定文件夹(默认为Download)"progress:^(NSProgress * _Nonnull progress) {
CGFloat stauts = 100.f * progress.completedUnitCount/progress.totalUnitCount;
CGFloat pro = stauts/100.f;
NSLog(@"pro = %.2f",pro);
hud.progress = pro;
//此处只用于Demo演示,展示不同状态的hudif (pro >= 0.5) {
hud.mode = MBProgressHUDModeAnnularDeterminate;
}
if (pro == 1.0) {
UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
hud.customView = imageView;
hud.mode = MBProgressHUDModeCustomView;
hud.label.text = NSLocalizedString(@"下载完成", @"HUD completed title");
hud.detailsLabel.text = @"";
[hud hideAnimated:YESafterDelay:1.5];
}
} success:^(NSString * _Nonnull path) {
} failure:^(NSError * _Nonnull error) {
}];
}
//暂停下载,暂不支持断点下载
[task suspend];
//开始下载
[task resume];

文件上传

NSURLSessionTask *task = [MSNetwork uploadFileWithURL:@""parameters:@{@"参数":@"参数"}
name:@"文件对应服务器上的字段"filePath:@"文件本地的沙盒路径"progress:^(NSProgress *progress) {
//上传进度NSLog(@"上传进度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
} success:^(id responseObject) {
//上传成功
} failure:^(NSError *error) {
//上传失败
}];

单/多图上传

NSURLSessionTask *task = [MSNetwork uploadImageURL:@""parameters:@{} images:@[@"图片类型数组"] name:@"文件对应服务器上的字段"fileName:@"图片名称"imageScale:0.5imageType:@"png\jpg\jpeg..."progress:^(NSProgress * _Nonnull progress) {
//上传进度NSLog(@"上传进度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
} success:^(id _Nonnull responseObject) {
//上传成功
} failure:^(NSError * _Nonnull error) {
//上传失败
}];

重置AFHTTPSessionManager相关属性

#pragma mark - 设置AFHTTPSessionManager相关属性
#pragma mark 注意: 因为全局只有一个AFHTTPSessionManager实例,所以以下设置方式全局生效
/**在开发中,如果以下的设置方式不满足项目的需求,就调用此方法获取AFHTTPSessionManager实例进行自定义设置(注意: 调用此方法时在要导入AFNetworking.h头文件,否则可能会报找不到AFHTTPSessionManager的❌)@param sessionManager AFHTTPSessionManager的实例*/
+ (void)setAFHTTPSessionManagerProperty:(void(^)(AFHTTPSessionManager *sessionManager))sessionManager;
/**设置网络请求参数的格式:默认为JSON格式@param requestSerializer MSRequestSerializerJSON---JSON格式 MSRequestSerializerHTTP--HTTP*/
+ (void)setRequestSerializer:(MSRequestSerializer)requestSerializer;
/**设置服务器响应数据格式:默认为JSON格式@param responseSerializer MSResponseSerializerJSON---JSON格式 MSResponseSerializerHTTP--HTTP*/
+ (void)setResponseSerializer:(MSResponseSerializer)responseSerializer;
/**设置请求头*/
+ (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
/**配置自建证书的Https请求,参考链接:http://blog.csdn.net/syg90178aw/article/details/52839103@param cerPath 自建https证书路径@param validatesDomainName 是否验证域名(默认YES) 如果证书的域名与请求的域名不一致,需设置为NO服务器使用其他信任机构颁发的证书也可以建立连接,但这个非常危险,建议打开 .validatesDomainName=NO,主要用于这种情况:客户端请求的是子域名,而证书上是另外一个域名。因为SSL证书上的域名是独立的For example:证书注册的域名是www.baidu.com,那么mail.baidu.com是无法验证通过的*/
+ (void)setSecurityPolicyWithCerPath:(NSString *)cerPath validatesDomainName:(BOOL)validatesDomainName;

MSNetwork全部以类方法调用,使用简单,麻麻再也不用担心我一句一句地写SQLite啦~~~

如果关于缓存策略你有更好的建议或者思路,希望留言告知!不吝赐教!

万水千山总是情,给个Start行不行!!!~ Q.Q ~

About

基于AFNetworking 4.x与YYCache的二次封装,包括网络请求、文件上传、文件下载这三个方法。并且支持RESTful API,GET、POST、HEAD、PUT、DELETE、PATCH的请求,方法接口简洁明了,并结合YYCache做了网络数据的缓存策略。简单易用,一句代码搞定网络数据的请求与缓存,控制台可直接打印json中文字符,调试更方便

Topics

Resources

Stars

35 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MSNetwork

基于AFNetworking 4.x与YYCache的二次封装,包括网络请求、文件上传、文件下载这三个方法。并且支持RESTful API,GET、POST、HEAD、PUT、DELETE、PATCH的请求,方法接口简洁明了,并结合YYCache做了网络数据的缓存策略。简单易用,一句代码搞定网络数据的请求与缓存,控制台可直接打印json中文字符,调试更方便

效果图

请求方式缓存策略文件下载文件上传

暂未测试

Requirements 要求

  • iOS 9+
  • Xcode 10+

安装!

Cocoapods安装

 pod 'MSNetwork'

手动安装

注意: 项目中需要有AFN 4.x , YYCache第三方库! 在工程中链接sqlite3依赖库

1、下载Demo后将MSNetwork文件夹添加到项目目录中;
2、创建并配置PrefixHeader.pch文件或者导入头文件MSNetwork.h开始使用即可;

Usage 使用方法

所有方法都可以直接看 MSNetwork.h 中的声明以及注释。

MSNetwork 的全局配置

设置日志

关于日志打印
//开启日志打印 默认打开(Debug级别)
[MSNetwork openLog];
//关闭日志打印,
[MSNetwork closeLog];

设置请求根路径

//最终完整Url为[NSString stringWithFormat:@“%@%@”,_baseURL,URL],
[MSNetwork setBaseURL:@"https://www.baidu.com/"];

设置缓存过滤参数key(如时间戳,随机数)否则会导致无法得到缓存数据

[MSNetwork setFiltrationCacheKey:@[@"2",@"3"]];

设置全局请求参数

NSDictionary *dic = @{@"accountToken":@{@"clientType":@"",@"tokenKey":@""}};
[MSNetwork setBaseParameters:dic];

设置网络请求超时时间

[MSNetwork setRequestTimeoutInterval:15.0f];

设置网络请求头

//可一次设置多个也可单独设置//[MSNetwork setHeadr:@{@"api-version":@"v1.0.0"}];
[MSNetwork setValue:@"9"forHTTPHeaderField:@"fromType"];

网络状态

网络状态监听

[MSNetwork networkStatusWithBlock:^(MSNetworkStatusType status) {
switch (status) {
case MSNetworkStatusUnknown:
//未知网络break;
case MSNetworkStatusNotReachable:
//无网路break;
case MSNetworkStatusReachableWWAN:
//手机网络break;
case MSNetworkStatusReachableWiFi:
//WiFi网络break;
default:
break;
}
}];

判断有无网络

if (kIsNetwork) {
NSLog(@"有网络");
if (kIsWWANNetwork) {
NSLog(@"手机网络");
}elseif (kIsWiFiNetwork){
NSLog(@"WiFi网络");
}
} else {
NSLog(@"无网络");
}
//// if ([MSNetwork isNetwork]) {// NSLog(@"有网络");// if ([MSNetwork isWWANNetwork]) {// NSLog(@"手机网络");// }else if ([MSNetwork isWiFiNetwork]){// NSLog(@"WiFi网络");// }// } else {// NSLog(@"无网络");// }

网络缓存

缓存策略

这是我目前能想到的几个缓存场景

  • 只从网络获取数据,且数据不会缓存在本地(一般情况)
  • 从缓存读取数据并返回,再从网络获取并缓存,每次只读取缓存数据(一般用于广告页面可提高加载速度)
  • 先从网络获取数据并缓存数据,如果访问网络失败再从缓存读取,失败的Block和成功的Block都会执行(如果有更好的建议可以告诉我)
  • 先从缓存读取数据,然后在从网络获取并且缓存,在这种情况下,Block将产生两次调用(如果有更好的建议可以告诉我)
typedefNS_ENUM(NSUInteger, MSCachePolicy){
/**只从网络获取数据,且数据不会缓存在本地**/
MSCachePolicyOnlyNetNoCache = 0,
/** 从缓存读取数据并返回,再从网络获取并缓存,每次只读取缓存数据**/
MSCachePolicyCacheElseNet,
/** 先从网络获取数据并缓存数据,如果访问网络失败再从缓存读取,失败的Block和成功的Block都会执行*/
MSCachePolicyNetElseCache,
/**先从缓存读取数据,然后在从网络获取并且缓存,在这种情况下,缓存数据与网络数据不一致Block将产生两次调用*/
MSCachePolicyCacheThenNet
};

缓存大小

CGFloat totalBytes = [MSNetwork getAllHttpCacheSize]/1024.f;
NSLog(@"网络缓存大小cache = %fKB",totalBytes);
//或者
[MSNetwork getAllHttpCacheSizeBlock:^(NSInteger totalCount) {
NSLog(@"网络缓存大小cache = %.2fMB",totalCount/1024/1024.f);
}];

删除网络缓存

__weak __typeof(&*self)weakSelf = self;
[MSNetwork removeAllHttpCacheBlock:^(int removedCount, int totalCount) {
NSLog(@"cache progress = %d",removedCount/totalCount);
} endBlock:^(BOOL error) {
//通知主线程刷新dispatch_async(dispatch_get_main_queue(), ^{
});
}]; //或者// [MSNetwork removeAllHttpCache];

网络请求

GET

__weak __typeof(&*self)weakSelf = self;
NSDictionary *para = @{@"a":@"list", @"c":@"data",@"client":@"iphone",@"page":@"0",@"per":@"10", @"type":@"29"};
[MSHTTPRequest GET:@""parameters:para cachePolicy:MSCachePolicyCacheThenNet success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

POST

__weak __typeof(&*self)weakSelf = self;
[MSHTTPRequest POST:@""parameters:@{} cachePolicy:MSCachePolicyCacheThenNet success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

其他请求方式(HEAD、PUT、DELETE、PATCH)

HEAD、PUT、DELETE、PATCH请求方式和GET、POST方式类似,请前往MSNetwork.h文件中查看对应方法(相信聪明的你一看就明白了!~ Q.Q ~)

自定义请求方式

[MSNetwork HTTPWithMethod:@""url:@""parameters:@{} cachePolicy:设置缓存策略的枚举 success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

文件下载

- (void)downLoadFiles {
MBProgressHUD *hud = [MBProgressHUD mb_showBar:@"正在下载..."detailMsg:@"请不要退出程序,以免下载失败!"onView:nilhideBlock:^{
NSLog(@"hud已经隐藏");
}];
NSURLSessionTask *task = [MSNetwork downloadWithURL:@""fileDir:@"下载至沙盒中的制定文件夹(默认为Download)"progress:^(NSProgress * _Nonnull progress) {
CGFloat stauts = 100.f * progress.completedUnitCount/progress.totalUnitCount;
CGFloat pro = stauts/100.f;
NSLog(@"pro = %.2f",pro);
hud.progress = pro;
//此处只用于Demo演示,展示不同状态的hudif (pro >= 0.5) {
hud.mode = MBProgressHUDModeAnnularDeterminate;
}
if (pro == 1.0) {
UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
hud.customView = imageView;
hud.mode = MBProgressHUDModeCustomView;
hud.label.text = NSLocalizedString(@"下载完成", @"HUD completed title");
hud.detailsLabel.text = @"";
[hud hideAnimated:YESafterDelay:1.5];
}
} success:^(NSString * _Nonnull path) {
} failure:^(NSError * _Nonnull error) {
}];
}
//暂停下载,暂不支持断点下载
[task suspend];
//开始下载
[task resume];

文件上传

NSURLSessionTask *task = [MSNetwork uploadFileWithURL:@""parameters:@{@"参数":@"参数"}
name:@"文件对应服务器上的字段"filePath:@"文件本地的沙盒路径"progress:^(NSProgress *progress) {
//上传进度NSLog(@"上传进度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
} success:^(id responseObject) {
//上传成功
} failure:^(NSError *error) {
//上传失败
}];

单/多图上传

NSURLSessionTask *task = [MSNetwork uploadImageURL:@""parameters:@{} images:@[@"图片类型数组"] name:@"文件对应服务器上的字段"fileName:@"图片名称"imageScale:0.5imageType:@"png\jpg\jpeg..."progress:^(NSProgress * _Nonnull progress) {
//上传进度NSLog(@"上传进度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
} success:^(id _Nonnull responseObject) {
//上传成功
} failure:^(NSError * _Nonnull error) {
//上传失败
}];

重置AFHTTPSessionManager相关属性

#pragma mark - 设置AFHTTPSessionManager相关属性
#pragma mark 注意: 因为全局只有一个AFHTTPSessionManager实例,所以以下设置方式全局生效
/**在开发中,如果以下的设置方式不满足项目的需求,就调用此方法获取AFHTTPSessionManager实例进行自定义设置(注意: 调用此方法时在要导入AFNetworking.h头文件,否则可能会报找不到AFHTTPSessionManager的❌)@param sessionManager AFHTTPSessionManager的实例*/
+ (void)setAFHTTPSessionManagerProperty:(void(^)(AFHTTPSessionManager *sessionManager))sessionManager;
/**设置网络请求参数的格式:默认为JSON格式@param requestSerializer MSRequestSerializerJSON---JSON格式 MSRequestSerializerHTTP--HTTP*/
+ (void)setRequestSerializer:(MSRequestSerializer)requestSerializer;
/**设置服务器响应数据格式:默认为JSON格式@param responseSerializer MSResponseSerializerJSON---JSON格式 MSResponseSerializerHTTP--HTTP*/
+ (void)setResponseSerializer:(MSResponseSerializer)responseSerializer;
/**设置请求头*/
+ (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
/**配置自建证书的Https请求,参考链接:http://blog.csdn.net/syg90178aw/article/details/52839103@param cerPath 自建https证书路径@param validatesDomainName 是否验证域名(默认YES) 如果证书的域名与请求的域名不一致,需设置为NO服务器使用其他信任机构颁发的证书也可以建立连接,但这个非常危险,建议打开 .validatesDomainName=NO,主要用于这种情况:客户端请求的是子域名,而证书上是另外一个域名。因为SSL证书上的域名是独立的For example:证书注册的域名是www.baidu.com,那么mail.baidu.com是无法验证通过的*/
+ (void)setSecurityPolicyWithCerPath:(NSString *)cerPath validatesDomainName:(BOOL)validatesDomainName;

MSNetwork全部以类方法调用,使用简单,麻麻再也不用担心我一句一句地写SQLite啦~~~

如果关于缓存策略你有更好的建议或者思路,希望留言告知!不吝赐教!

万水千山总是情,给个Start行不行!!!~ Q.Q ~

About

基于AFNetworking 4.x与YYCache的二次封装,包括网络请求、文件上传、文件下载这三个方法。并且支持RESTful API,GET、POST、HEAD、PUT、DELETE、PATCH的请求,方法接口简洁明了,并结合YYCache做了网络数据的缓存策略。简单易用,一句代码搞定网络数据的请求与缓存,控制台可直接打印json中文字符,调试更方便

Topics

Resources

Stars

35 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MSNetwork

基于AFNetworking 4.x与YYCache的二次封装,包括网络请求、文件上传、文件下载这三个方法。并且支持RESTful API,GET、POST、HEAD、PUT、DELETE、PATCH的请求,方法接口简洁明了,并结合YYCache做了网络数据的缓存策略。简单易用,一句代码搞定网络数据的请求与缓存,控制台可直接打印json中文字符,调试更方便

效果图

请求方式缓存策略文件下载文件上传

暂未测试

Requirements 要求

  • iOS 9+
  • Xcode 10+

安装!

Cocoapods安装

 pod 'MSNetwork'

手动安装

注意: 项目中需要有AFN 4.x , YYCache第三方库! 在工程中链接sqlite3依赖库

1、下载Demo后将MSNetwork文件夹添加到项目目录中;
2、创建并配置PrefixHeader.pch文件或者导入头文件MSNetwork.h开始使用即可;

Usage 使用方法

所有方法都可以直接看 MSNetwork.h 中的声明以及注释。

MSNetwork 的全局配置

设置日志

关于日志打印
//开启日志打印 默认打开(Debug级别)
[MSNetwork openLog];
//关闭日志打印,
[MSNetwork closeLog];

设置请求根路径

//最终完整Url为[NSString stringWithFormat:@“%@%@”,_baseURL,URL],
[MSNetwork setBaseURL:@"https://www.baidu.com/"];

设置缓存过滤参数key(如时间戳,随机数)否则会导致无法得到缓存数据

[MSNetwork setFiltrationCacheKey:@[@"2",@"3"]];

设置全局请求参数

NSDictionary *dic = @{@"accountToken":@{@"clientType":@"",@"tokenKey":@""}};
[MSNetwork setBaseParameters:dic];

设置网络请求超时时间

[MSNetwork setRequestTimeoutInterval:15.0f];

设置网络请求头

//可一次设置多个也可单独设置//[MSNetwork setHeadr:@{@"api-version":@"v1.0.0"}];
[MSNetwork setValue:@"9"forHTTPHeaderField:@"fromType"];

网络状态

网络状态监听

[MSNetwork networkStatusWithBlock:^(MSNetworkStatusType status) {
switch (status) {
case MSNetworkStatusUnknown:
//未知网络break;
case MSNetworkStatusNotReachable:
//无网路break;
case MSNetworkStatusReachableWWAN:
//手机网络break;
case MSNetworkStatusReachableWiFi:
//WiFi网络break;
default:
break;
}
}];

判断有无网络

if (kIsNetwork) {
NSLog(@"有网络");
if (kIsWWANNetwork) {
NSLog(@"手机网络");
}elseif (kIsWiFiNetwork){
NSLog(@"WiFi网络");
}
} else {
NSLog(@"无网络");
}
//// if ([MSNetwork isNetwork]) {// NSLog(@"有网络");// if ([MSNetwork isWWANNetwork]) {// NSLog(@"手机网络");// }else if ([MSNetwork isWiFiNetwork]){// NSLog(@"WiFi网络");// }// } else {// NSLog(@"无网络");// }

网络缓存

缓存策略

这是我目前能想到的几个缓存场景

  • 只从网络获取数据,且数据不会缓存在本地(一般情况)
  • 从缓存读取数据并返回,再从网络获取并缓存,每次只读取缓存数据(一般用于广告页面可提高加载速度)
  • 先从网络获取数据并缓存数据,如果访问网络失败再从缓存读取,失败的Block和成功的Block都会执行(如果有更好的建议可以告诉我)
  • 先从缓存读取数据,然后在从网络获取并且缓存,在这种情况下,Block将产生两次调用(如果有更好的建议可以告诉我)
typedefNS_ENUM(NSUInteger, MSCachePolicy){
/**只从网络获取数据,且数据不会缓存在本地**/
MSCachePolicyOnlyNetNoCache = 0,
/** 从缓存读取数据并返回,再从网络获取并缓存,每次只读取缓存数据**/
MSCachePolicyCacheElseNet,
/** 先从网络获取数据并缓存数据,如果访问网络失败再从缓存读取,失败的Block和成功的Block都会执行*/
MSCachePolicyNetElseCache,
/**先从缓存读取数据,然后在从网络获取并且缓存,在这种情况下,缓存数据与网络数据不一致Block将产生两次调用*/
MSCachePolicyCacheThenNet
};

缓存大小

CGFloat totalBytes = [MSNetwork getAllHttpCacheSize]/1024.f;
NSLog(@"网络缓存大小cache = %fKB",totalBytes);
//或者
[MSNetwork getAllHttpCacheSizeBlock:^(NSInteger totalCount) {
NSLog(@"网络缓存大小cache = %.2fMB",totalCount/1024/1024.f);
}];

删除网络缓存

__weak __typeof(&*self)weakSelf = self;
[MSNetwork removeAllHttpCacheBlock:^(int removedCount, int totalCount) {
NSLog(@"cache progress = %d",removedCount/totalCount);
} endBlock:^(BOOL error) {
//通知主线程刷新dispatch_async(dispatch_get_main_queue(), ^{
});
}]; //或者// [MSNetwork removeAllHttpCache];

网络请求

GET

__weak __typeof(&*self)weakSelf = self;
NSDictionary *para = @{@"a":@"list", @"c":@"data",@"client":@"iphone",@"page":@"0",@"per":@"10", @"type":@"29"};
[MSHTTPRequest GET:@""parameters:para cachePolicy:MSCachePolicyCacheThenNet success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

POST

__weak __typeof(&*self)weakSelf = self;
[MSHTTPRequest POST:@""parameters:@{} cachePolicy:MSCachePolicyCacheThenNet success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

其他请求方式(HEAD、PUT、DELETE、PATCH)

HEAD、PUT、DELETE、PATCH请求方式和GET、POST方式类似,请前往MSNetwork.h文件中查看对应方法(相信聪明的你一看就明白了!~ Q.Q ~)

自定义请求方式

[MSNetwork HTTPWithMethod:@""url:@""parameters:@{} cachePolicy:设置缓存策略的枚举 success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

文件下载

- (void)downLoadFiles {
MBProgressHUD *hud = [MBProgressHUD mb_showBar:@"正在下载..."detailMsg:@"请不要退出程序,以免下载失败!"onView:nilhideBlock:^{
NSLog(@"hud已经隐藏");
}];
NSURLSessionTask *task = [MSNetwork downloadWithURL:@""fileDir:@"下载至沙盒中的制定文件夹(默认为Download)"progress:^(NSProgress * _Nonnull progress) {
CGFloat stauts = 100.f * progress.completedUnitCount/progress.totalUnitCount;
CGFloat pro = stauts/100.f;
NSLog(@"pro = %.2f",pro);
hud.progress = pro;
//此处只用于Demo演示,展示不同状态的hudif (pro >= 0.5) {
hud.mode = MBProgressHUDModeAnnularDeterminate;
}
if (pro == 1.0) {
UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
hud.customView = imageView;
hud.mode = MBProgressHUDModeCustomView;
hud.label.text = NSLocalizedString(@"下载完成", @"HUD completed title");
hud.detailsLabel.text = @"";
[hud hideAnimated:YESafterDelay:1.5];
}
} success:^(NSString * _Nonnull path) {
} failure:^(NSError * _Nonnull error) {
}];
}
//暂停下载,暂不支持断点下载
[task suspend];
//开始下载
[task resume];

文件上传

NSURLSessionTask *task = [MSNetwork uploadFileWithURL:@""parameters:@{@"参数":@"参数"}
name:@"文件对应服务器上的字段"filePath:@"文件本地的沙盒路径"progress:^(NSProgress *progress) {
//上传进度NSLog(@"上传进度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
} success:^(id responseObject) {
//上传成功
} failure:^(NSError *error) {
//上传失败
}];

单/多图上传

NSURLSessionTask *task = [MSNetwork uploadImageURL:@""parameters:@{} images:@[@"图片类型数组"] name:@"文件对应服务器上的字段"fileName:@"图片名称"imageScale:0.5imageType:@"png\jpg\jpeg..."progress:^(NSProgress * _Nonnull progress) {
//上传进度NSLog(@"上传进度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
} success:^(id _Nonnull responseObject) {
//上传成功
} failure:^(NSError * _Nonnull error) {
//上传失败
}];

重置AFHTTPSessionManager相关属性

#pragma mark - 设置AFHTTPSessionManager相关属性
#pragma mark 注意: 因为全局只有一个AFHTTPSessionManager实例,所以以下设置方式全局生效
/**在开发中,如果以下的设置方式不满足项目的需求,就调用此方法获取AFHTTPSessionManager实例进行自定义设置(注意: 调用此方法时在要导入AFNetworking.h头文件,否则可能会报找不到AFHTTPSessionManager的❌)@param sessionManager AFHTTPSessionManager的实例*/
+ (void)setAFHTTPSessionManagerProperty:(void(^)(AFHTTPSessionManager *sessionManager))sessionManager;
/**设置网络请求参数的格式:默认为JSON格式@param requestSerializer MSRequestSerializerJSON---JSON格式 MSRequestSerializerHTTP--HTTP*/
+ (void)setRequestSerializer:(MSRequestSerializer)requestSerializer;
/**设置服务器响应数据格式:默认为JSON格式@param responseSerializer MSResponseSerializerJSON---JSON格式 MSResponseSerializerHTTP--HTTP*/
+ (void)setResponseSerializer:(MSResponseSerializer)responseSerializer;
/**设置请求头*/
+ (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
/**配置自建证书的Https请求,参考链接:http://blog.csdn.net/syg90178aw/article/details/52839103@param cerPath 自建https证书路径@param validatesDomainName 是否验证域名(默认YES) 如果证书的域名与请求的域名不一致,需设置为NO服务器使用其他信任机构颁发的证书也可以建立连接,但这个非常危险,建议打开 .validatesDomainName=NO,主要用于这种情况:客户端请求的是子域名,而证书上是另外一个域名。因为SSL证书上的域名是独立的For example:证书注册的域名是www.baidu.com,那么mail.baidu.com是无法验证通过的*/
+ (void)setSecurityPolicyWithCerPath:(NSString *)cerPath validatesDomainName:(BOOL)validatesDomainName;

MSNetwork全部以类方法调用,使用简单,麻麻再也不用担心我一句一句地写SQLite啦~~~

如果关于缓存策略你有更好的建议或者思路,希望留言告知!不吝赐教!

万水千山总是情,给个Start行不行!!!~ Q.Q ~

About

基于AFNetworking 4.x与YYCache的二次封装,包括网络请求、文件上传、文件下载这三个方法。并且支持RESTful API,GET、POST、HEAD、PUT、DELETE、PATCH的请求,方法接口简洁明了,并结合YYCache做了网络数据的缓存策略。简单易用,一句代码搞定网络数据的请求与缓存,控制台可直接打印json中文字符,调试更方便

Topics

Resources

Stars

35 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MSNetwork

基于AFNetworking 4.x与YYCache的二次封装,包括网络请求、文件上传、文件下载这三个方法。并且支持RESTful API,GET、POST、HEAD、PUT、DELETE、PATCH的请求,方法接口简洁明了,并结合YYCache做了网络数据的缓存策略。简单易用,一句代码搞定网络数据的请求与缓存,控制台可直接打印json中文字符,调试更方便

效果图

请求方式缓存策略文件下载文件上传

暂未测试

Requirements 要求

  • iOS 9+
  • Xcode 10+

安装!

Cocoapods安装

 pod 'MSNetwork'

手动安装

注意: 项目中需要有AFN 4.x , YYCache第三方库! 在工程中链接sqlite3依赖库

1、下载Demo后将MSNetwork文件夹添加到项目目录中;
2、创建并配置PrefixHeader.pch文件或者导入头文件MSNetwork.h开始使用即可;

Usage 使用方法

所有方法都可以直接看 MSNetwork.h 中的声明以及注释。

MSNetwork 的全局配置

设置日志

关于日志打印
//开启日志打印 默认打开(Debug级别)
[MSNetwork openLog];
//关闭日志打印,
[MSNetwork closeLog];

设置请求根路径

//最终完整Url为[NSString stringWithFormat:@“%@%@”,_baseURL,URL],
[MSNetwork setBaseURL:@"https://www.baidu.com/"];

设置缓存过滤参数key(如时间戳,随机数)否则会导致无法得到缓存数据

[MSNetwork setFiltrationCacheKey:@[@"2",@"3"]];

设置全局请求参数

NSDictionary *dic = @{@"accountToken":@{@"clientType":@"",@"tokenKey":@""}};
[MSNetwork setBaseParameters:dic];

设置网络请求超时时间

[MSNetwork setRequestTimeoutInterval:15.0f];

设置网络请求头

//可一次设置多个也可单独设置//[MSNetwork setHeadr:@{@"api-version":@"v1.0.0"}];
[MSNetwork setValue:@"9"forHTTPHeaderField:@"fromType"];

网络状态

网络状态监听

[MSNetwork networkStatusWithBlock:^(MSNetworkStatusType status) {
switch (status) {
case MSNetworkStatusUnknown:
//未知网络break;
case MSNetworkStatusNotReachable:
//无网路break;
case MSNetworkStatusReachableWWAN:
//手机网络break;
case MSNetworkStatusReachableWiFi:
//WiFi网络break;
default:
break;
}
}];

判断有无网络

if (kIsNetwork) {
NSLog(@"有网络");
if (kIsWWANNetwork) {
NSLog(@"手机网络");
}elseif (kIsWiFiNetwork){
NSLog(@"WiFi网络");
}
} else {
NSLog(@"无网络");
}
//// if ([MSNetwork isNetwork]) {// NSLog(@"有网络");// if ([MSNetwork isWWANNetwork]) {// NSLog(@"手机网络");// }else if ([MSNetwork isWiFiNetwork]){// NSLog(@"WiFi网络");// }// } else {// NSLog(@"无网络");// }

网络缓存

缓存策略

这是我目前能想到的几个缓存场景

  • 只从网络获取数据,且数据不会缓存在本地(一般情况)
  • 从缓存读取数据并返回,再从网络获取并缓存,每次只读取缓存数据(一般用于广告页面可提高加载速度)
  • 先从网络获取数据并缓存数据,如果访问网络失败再从缓存读取,失败的Block和成功的Block都会执行(如果有更好的建议可以告诉我)
  • 先从缓存读取数据,然后在从网络获取并且缓存,在这种情况下,Block将产生两次调用(如果有更好的建议可以告诉我)
typedefNS_ENUM(NSUInteger, MSCachePolicy){
/**只从网络获取数据,且数据不会缓存在本地**/
MSCachePolicyOnlyNetNoCache = 0,
/** 从缓存读取数据并返回,再从网络获取并缓存,每次只读取缓存数据**/
MSCachePolicyCacheElseNet,
/** 先从网络获取数据并缓存数据,如果访问网络失败再从缓存读取,失败的Block和成功的Block都会执行*/
MSCachePolicyNetElseCache,
/**先从缓存读取数据,然后在从网络获取并且缓存,在这种情况下,缓存数据与网络数据不一致Block将产生两次调用*/
MSCachePolicyCacheThenNet
};

缓存大小

CGFloat totalBytes = [MSNetwork getAllHttpCacheSize]/1024.f;
NSLog(@"网络缓存大小cache = %fKB",totalBytes);
//或者
[MSNetwork getAllHttpCacheSizeBlock:^(NSInteger totalCount) {
NSLog(@"网络缓存大小cache = %.2fMB",totalCount/1024/1024.f);
}];

删除网络缓存

__weak __typeof(&*self)weakSelf = self;
[MSNetwork removeAllHttpCacheBlock:^(int removedCount, int totalCount) {
NSLog(@"cache progress = %d",removedCount/totalCount);
} endBlock:^(BOOL error) {
//通知主线程刷新dispatch_async(dispatch_get_main_queue(), ^{
});
}]; //或者// [MSNetwork removeAllHttpCache];

网络请求

GET

__weak __typeof(&*self)weakSelf = self;
NSDictionary *para = @{@"a":@"list", @"c":@"data",@"client":@"iphone",@"page":@"0",@"per":@"10", @"type":@"29"};
[MSHTTPRequest GET:@""parameters:para cachePolicy:MSCachePolicyCacheThenNet success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

POST

__weak __typeof(&*self)weakSelf = self;
[MSHTTPRequest POST:@""parameters:@{} cachePolicy:MSCachePolicyCacheThenNet success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

其他请求方式(HEAD、PUT、DELETE、PATCH)

HEAD、PUT、DELETE、PATCH请求方式和GET、POST方式类似,请前往MSNetwork.h文件中查看对应方法(相信聪明的你一看就明白了!~ Q.Q ~)

自定义请求方式

[MSNetwork HTTPWithMethod:@""url:@""parameters:@{} cachePolicy:设置缓存策略的枚举 success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

文件下载

- (void)downLoadFiles {
MBProgressHUD *hud = [MBProgressHUD mb_showBar:@"正在下载..."detailMsg:@"请不要退出程序,以免下载失败!"onView:nilhideBlock:^{
NSLog(@"hud已经隐藏");
}];
NSURLSessionTask *task = [MSNetwork downloadWithURL:@""fileDir:@"下载至沙盒中的制定文件夹(默认为Download)"progress:^(NSProgress * _Nonnull progress) {
CGFloat stauts = 100.f * progress.completedUnitCount/progress.totalUnitCount;
CGFloat pro = stauts/100.f;
NSLog(@"pro = %.2f",pro);
hud.progress = pro;
//此处只用于Demo演示,展示不同状态的hudif (pro >= 0.5) {
hud.mode = MBProgressHUDModeAnnularDeterminate;
}
if (pro == 1.0) {
UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
hud.customView = imageView;
hud.mode = MBProgressHUDModeCustomView;
hud.label.text = NSLocalizedString(@"下载完成", @"HUD completed title");
hud.detailsLabel.text = @"";
[hud hideAnimated:YESafterDelay:1.5];
}
} success:^(NSString * _Nonnull path) {
} failure:^(NSError * _Nonnull error) {
}];
}
//暂停下载,暂不支持断点下载
[task suspend];
//开始下载
[task resume];

文件上传

NSURLSessionTask *task = [MSNetwork uploadFileWithURL:@""parameters:@{@"参数":@"参数"}
name:@"文件对应服务器上的字段"filePath:@"文件本地的沙盒路径"progress:^(NSProgress *progress) {
//上传进度NSLog(@"上传进度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
} success:^(id responseObject) {
//上传成功
} failure:^(NSError *error) {
//上传失败
}];

单/多图上传

NSURLSessionTask *task = [MSNetwork uploadImageURL:@""parameters:@{} images:@[@"图片类型数组"] name:@"文件对应服务器上的字段"fileName:@"图片名称"imageScale:0.5imageType:@"png\jpg\jpeg..."progress:^(NSProgress * _Nonnull progress) {
//上传进度NSLog(@"上传进度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
} success:^(id _Nonnull responseObject) {
//上传成功
} failure:^(NSError * _Nonnull error) {
//上传失败
}];

重置AFHTTPSessionManager相关属性

#pragma mark - 设置AFHTTPSessionManager相关属性
#pragma mark 注意: 因为全局只有一个AFHTTPSessionManager实例,所以以下设置方式全局生效
/**在开发中,如果以下的设置方式不满足项目的需求,就调用此方法获取AFHTTPSessionManager实例进行自定义设置(注意: 调用此方法时在要导入AFNetworking.h头文件,否则可能会报找不到AFHTTPSessionManager的❌)@param sessionManager AFHTTPSessionManager的实例*/
+ (void)setAFHTTPSessionManagerProperty:(void(^)(AFHTTPSessionManager *sessionManager))sessionManager;
/**设置网络请求参数的格式:默认为JSON格式@param requestSerializer MSRequestSerializerJSON---JSON格式 MSRequestSerializerHTTP--HTTP*/
+ (void)setRequestSerializer:(MSRequestSerializer)requestSerializer;
/**设置服务器响应数据格式:默认为JSON格式@param responseSerializer MSResponseSerializerJSON---JSON格式 MSResponseSerializerHTTP--HTTP*/
+ (void)setResponseSerializer:(MSResponseSerializer)responseSerializer;
/**设置请求头*/
+ (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
/**配置自建证书的Https请求,参考链接:http://blog.csdn.net/syg90178aw/article/details/52839103@param cerPath 自建https证书路径@param validatesDomainName 是否验证域名(默认YES) 如果证书的域名与请求的域名不一致,需设置为NO服务器使用其他信任机构颁发的证书也可以建立连接,但这个非常危险,建议打开 .validatesDomainName=NO,主要用于这种情况:客户端请求的是子域名,而证书上是另外一个域名。因为SSL证书上的域名是独立的For example:证书注册的域名是www.baidu.com,那么mail.baidu.com是无法验证通过的*/
+ (void)setSecurityPolicyWithCerPath:(NSString *)cerPath validatesDomainName:(BOOL)validatesDomainName;

MSNetwork全部以类方法调用,使用简单,麻麻再也不用担心我一句一句地写SQLite啦~~~

如果关于缓存策略你有更好的建议或者思路,希望留言告知!不吝赐教!

万水千山总是情,给个Start行不行!!!~ Q.Q ~

About

基于AFNetworking 4.x与YYCache的二次封装,包括网络请求、文件上传、文件下载这三个方法。并且支持RESTful API,GET、POST、HEAD、PUT、DELETE、PATCH的请求,方法接口简洁明了,并结合YYCache做了网络数据的缓存策略。简单易用,一句代码搞定网络数据的请求与缓存,控制台可直接打印json中文字符,调试更方便

Topics

Resources

Stars

35 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

41 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

MSNetwork

基于AFNetworking 4.x与YYCache的二次封装,包括网络请求、文件上传、文件下载这三个方法。并且支持RESTful API,GET、POST、HEAD、PUT、DELETE、PATCH的请求,方法接口简洁明了,并结合YYCache做了网络数据的缓存策略。简单易用,一句代码搞定网络数据的请求与缓存,控制台可直接打印json中文字符,调试更方便

效果图

请求方式缓存策略文件下载文件上传

暂未测试

Requirements 要求

  • iOS 9+
  • Xcode 10+

安装!

Cocoapods安装

 pod 'MSNetwork'

手动安装

注意: 项目中需要有AFN 4.x , YYCache第三方库! 在工程中链接sqlite3依赖库

1、下载Demo后将MSNetwork文件夹添加到项目目录中;
2、创建并配置PrefixHeader.pch文件或者导入头文件MSNetwork.h开始使用即可;

Usage 使用方法

所有方法都可以直接看 MSNetwork.h 中的声明以及注释。

MSNetwork 的全局配置

设置日志

关于日志打印
//开启日志打印 默认打开(Debug级别)
[MSNetwork openLog];
//关闭日志打印,
[MSNetwork closeLog];

设置请求根路径

//最终完整Url为[NSString stringWithFormat:@“%@%@”,_baseURL,URL],
[MSNetwork setBaseURL:@"https://www.baidu.com/"];

设置缓存过滤参数key(如时间戳,随机数)否则会导致无法得到缓存数据

[MSNetwork setFiltrationCacheKey:@[@"2",@"3"]];

设置全局请求参数

NSDictionary *dic = @{@"accountToken":@{@"clientType":@"",@"tokenKey":@""}};
[MSNetwork setBaseParameters:dic];

设置网络请求超时时间

[MSNetwork setRequestTimeoutInterval:15.0f];

设置网络请求头

//可一次设置多个也可单独设置//[MSNetwork setHeadr:@{@"api-version":@"v1.0.0"}];
[MSNetwork setValue:@"9"forHTTPHeaderField:@"fromType"];

网络状态

网络状态监听

[MSNetwork networkStatusWithBlock:^(MSNetworkStatusType status) {
switch (status) {
case MSNetworkStatusUnknown:
//未知网络break;
case MSNetworkStatusNotReachable:
//无网路break;
case MSNetworkStatusReachableWWAN:
//手机网络break;
case MSNetworkStatusReachableWiFi:
//WiFi网络break;
default:
break;
}
}];

判断有无网络

if (kIsNetwork) {
NSLog(@"有网络");
if (kIsWWANNetwork) {
NSLog(@"手机网络");
}elseif (kIsWiFiNetwork){
NSLog(@"WiFi网络");
}
} else {
NSLog(@"无网络");
}
//// if ([MSNetwork isNetwork]) {// NSLog(@"有网络");// if ([MSNetwork isWWANNetwork]) {// NSLog(@"手机网络");// }else if ([MSNetwork isWiFiNetwork]){// NSLog(@"WiFi网络");// }// } else {// NSLog(@"无网络");// }

网络缓存

缓存策略

这是我目前能想到的几个缓存场景

  • 只从网络获取数据,且数据不会缓存在本地(一般情况)
  • 从缓存读取数据并返回,再从网络获取并缓存,每次只读取缓存数据(一般用于广告页面可提高加载速度)
  • 先从网络获取数据并缓存数据,如果访问网络失败再从缓存读取,失败的Block和成功的Block都会执行(如果有更好的建议可以告诉我)
  • 先从缓存读取数据,然后在从网络获取并且缓存,在这种情况下,Block将产生两次调用(如果有更好的建议可以告诉我)
typedefNS_ENUM(NSUInteger, MSCachePolicy){
/**只从网络获取数据,且数据不会缓存在本地**/
MSCachePolicyOnlyNetNoCache = 0,
/** 从缓存读取数据并返回,再从网络获取并缓存,每次只读取缓存数据**/
MSCachePolicyCacheElseNet,
/** 先从网络获取数据并缓存数据,如果访问网络失败再从缓存读取,失败的Block和成功的Block都会执行*/
MSCachePolicyNetElseCache,
/**先从缓存读取数据,然后在从网络获取并且缓存,在这种情况下,缓存数据与网络数据不一致Block将产生两次调用*/
MSCachePolicyCacheThenNet
};

缓存大小

CGFloat totalBytes = [MSNetwork getAllHttpCacheSize]/1024.f;
NSLog(@"网络缓存大小cache = %fKB",totalBytes);
//或者
[MSNetwork getAllHttpCacheSizeBlock:^(NSInteger totalCount) {
NSLog(@"网络缓存大小cache = %.2fMB",totalCount/1024/1024.f);
}];

删除网络缓存

__weak __typeof(&*self)weakSelf = self;
[MSNetwork removeAllHttpCacheBlock:^(int removedCount, int totalCount) {
NSLog(@"cache progress = %d",removedCount/totalCount);
} endBlock:^(BOOL error) {
//通知主线程刷新dispatch_async(dispatch_get_main_queue(), ^{
});
}]; //或者// [MSNetwork removeAllHttpCache];

网络请求

GET

__weak __typeof(&*self)weakSelf = self;
NSDictionary *para = @{@"a":@"list", @"c":@"data",@"client":@"iphone",@"page":@"0",@"per":@"10", @"type":@"29"};
[MSHTTPRequest GET:@""parameters:para cachePolicy:MSCachePolicyCacheThenNet success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

POST

__weak __typeof(&*self)weakSelf = self;
[MSHTTPRequest POST:@""parameters:@{} cachePolicy:MSCachePolicyCacheThenNet success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

其他请求方式(HEAD、PUT、DELETE、PATCH)

HEAD、PUT、DELETE、PATCH请求方式和GET、POST方式类似,请前往MSNetwork.h文件中查看对应方法(相信聪明的你一看就明白了!~ Q.Q ~)

自定义请求方式

[MSNetwork HTTPWithMethod:@""url:@""parameters:@{} cachePolicy:设置缓存策略的枚举 success:^(id _Nonnull responseObject) {
} failure:^(NSError * _Nonnull error) {
}];

文件下载

- (void)downLoadFiles {
MBProgressHUD *hud = [MBProgressHUD mb_showBar:@"正在下载..."detailMsg:@"请不要退出程序,以免下载失败!"onView:nilhideBlock:^{
NSLog(@"hud已经隐藏");
}];
NSURLSessionTask *task = [MSNetwork downloadWithURL:@""fileDir:@"下载至沙盒中的制定文件夹(默认为Download)"progress:^(NSProgress * _Nonnull progress) {
CGFloat stauts = 100.f * progress.completedUnitCount/progress.totalUnitCount;
CGFloat pro = stauts/100.f;
NSLog(@"pro = %.2f",pro);
hud.progress = pro;
//此处只用于Demo演示,展示不同状态的hudif (pro >= 0.5) {
hud.mode = MBProgressHUDModeAnnularDeterminate;
}
if (pro == 1.0) {
UIImage *image = [[UIImage imageNamed:@"Checkmark"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
hud.customView = imageView;
hud.mode = MBProgressHUDModeCustomView;
hud.label.text = NSLocalizedString(@"下载完成", @"HUD completed title");
hud.detailsLabel.text = @"";
[hud hideAnimated:YESafterDelay:1.5];
}
} success:^(NSString * _Nonnull path) {
} failure:^(NSError * _Nonnull error) {
}];
}
//暂停下载,暂不支持断点下载
[task suspend];
//开始下载
[task resume];

文件上传

NSURLSessionTask *task = [MSNetwork uploadFileWithURL:@""parameters:@{@"参数":@"参数"}
name:@"文件对应服务器上的字段"filePath:@"文件本地的沙盒路径"progress:^(NSProgress *progress) {
//上传进度NSLog(@"上传进度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
} success:^(id responseObject) {
//上传成功
} failure:^(NSError *error) {
//上传失败
}];

单/多图上传

NSURLSessionTask *task = [MSNetwork uploadImageURL:@""parameters:@{} images:@[@"图片类型数组"] name:@"文件对应服务器上的字段"fileName:@"图片名称"imageScale:0.5imageType:@"png\jpg\jpeg..."progress:^(NSProgress * _Nonnull progress) {
//上传进度NSLog(@"上传进度:%.2f%%",100.0 * progress.completedUnitCount/progress.totalUnitCount);
} success:^(id _Nonnull responseObject) {
//上传成功
} failure:^(NSError * _Nonnull error) {
//上传失败
}];

重置AFHTTPSessionManager相关属性

#pragma mark - 设置AFHTTPSessionManager相关属性
#pragma mark 注意: 因为全局只有一个AFHTTPSessionManager实例,所以以下设置方式全局生效
/**在开发中,如果以下的设置方式不满足项目的需求,就调用此方法获取AFHTTPSessionManager实例进行自定义设置(注意: 调用此方法时在要导入AFNetworking.h头文件,否则可能会报找不到AFHTTPSessionManager的❌)@param sessionManager AFHTTPSessionManager的实例*/
+ (void)setAFHTTPSessionManagerProperty:(void(^)(AFHTTPSessionManager *sessionManager))sessionManager;
/**设置网络请求参数的格式:默认为JSON格式@param requestSerializer MSRequestSerializerJSON---JSON格式 MSRequestSerializerHTTP--HTTP*/
+ (void)setRequestSerializer:(MSRequestSerializer)requestSerializer;
/**设置服务器响应数据格式:默认为JSON格式@param responseSerializer MSResponseSerializerJSON---JSON格式 MSResponseSerializerHTTP--HTTP*/
+ (void)setResponseSerializer:(MSResponseSerializer)responseSerializer;
/**设置请求头*/
+ (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;
/**配置自建证书的Https请求,参考链接:http://blog.csdn.net/syg90178aw/article/details/52839103@param cerPath 自建https证书路径@param validatesDomainName 是否验证域名(默认YES) 如果证书的域名与请求的域名不一致,需设置为NO服务器使用其他信任机构颁发的证书也可以建立连接,但这个非常危险,建议打开 .validatesDomainName=NO,主要用于这种情况:客户端请求的是子域名,而证书上是另外一个域名。因为SSL证书上的域名是独立的For example:证书注册的域名是www.baidu.com,那么mail.baidu.com是无法验证通过的*/
+ (void)setSecurityPolicyWithCerPath:(NSString *)cerPath validatesDomainName:(BOOL)validatesDomainName;

MSNetwork全部以类方法调用,使用简单,麻麻再也不用担心我一句一句地写SQLite啦~~~

如果关于缓存策略你有更好的建议或者思路,希望留言告知!不吝赐教!

万水千山总是情,给个Start行不行!!!~ Q.Q ~

About

基于AFNetworking 4.x与YYCache的二次封装,包括网络请求、文件上传、文件下载这三个方法。并且支持RESTful API,GET、POST、HEAD、PUT、DELETE、PATCH的请求,方法接口简洁明了,并结合YYCache做了网络数据的缓存策略。简单易用,一句代码搞定网络数据的请求与缓存,控制台可直接打印json中文字符,调试更方便

Topics

Resources

Stars

35 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages