//
NetworkManager.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
typedef NS_ENUM(NSUInteger, NetworkStatus) {
/** 未知網絡*/
NetworkStatusUnknown,
/** 無網絡*/
NetworkStatusNotReachable,
/** 手機網絡*/
NetworkStatusReachableViaWWAN,
/** WIFI網絡*/
NetworkStatusReachableViaWiFi
};
/** 請求成功的Block */
typedef void(^RequestSuccess)(id responSEObject);
/** 請求失敗的Block */
typedef void(^RequestFailed)(NSError *error);
/** 緩存的Block */
typedef void(^RequestCache)(id responseCache);
/** 網絡狀態的Block*/
typedef void(^GetNetworkStatus)(NetworkStatus status);
/** 上傳或下載進度*/
typedef void(^HttpPRogress)(NSProgress *progress);
@interface NetworkManager :NSObject
/**
* 開始監聽網絡狀態
*/
+ (void)startGetNetworkStatus;
/**
* 實時獲取網絡狀態回調
*/
+ (void)networkStatusWithBlock:(GetNetworkStatus)status;
/**
不帶緩存的GET請求
@param urlStr 請求路徑
@param success 請求成功
@param failure 請求失敗
*/
+(void)startRequestGetWithurl:(NSString *)urlStr whenSuccess:(RequestSuccess)success andFailure:(RequestFailed)failure;
/**
不帶緩存的POST請求
@param urlStr 請求路徑
@param params 請求參數
@param success 請求成功
@param failure 請求失敗
*/
+(void)startRequestWithurl:(NSString *)urlStr andParams:(NSDictionary *)params whenSuccess:(RequestSuccess)success andFailure:(RequestFailed)failure;
/**
帶緩存的GET請求
@param urlStr 請求路徑
@param requestCache 原來的緩存
@param success 請求成功
@param failure 請求失敗
*/
+(void)startRequestGetWithurl:(NSString *)urlStr andRequestCache:(RequestCache)requestCache whenSuccess:(RequestSuccess)success andFailure:(RequestFailed)failure;
/**
帶緩存的POST請求
@param urlStr 請求路徑
@param requestCache 原來的緩存
@param params 請求參數
@param success 請求成功
@param failure 請求失敗
*/
+(void)startRequestWithurl:(NSString *)urlStr andRequestCache:(RequestCache)requestCache andParams:(NSDictionary *)params whenSuccess:(RequestSuccess)success andFailure:(RequestFailed)failure;
/**
上傳單張圖片
@param urlStr 上傳路徑
@param parm 上傳參數
@param image 上傳的圖片
@param success 上傳成功
@param failure 上傳失敗
*/
+(void)uploadImageWithUrl:(NSString *)urlStr andParm:(NSDictionary *)parm andImage:(UIImage *)image andWhenSuccess:(RequestSuccess)success andWhenFailure:(RequestFailed)failure;
/**
上傳多張圖片
@param urlStr 上傳路徑
@param parm 上傳參數
@param imageArr 上傳的圖片
@param progress 上傳的進度
@param success 上傳成功
@param failure 上傳失敗
*/
+(void)uploadImageArrayWithUrl:(NSString *)urlStr andParm:(NSDictionary *)parm andImage:(NSArray <UIImage *> *)imageArr andProgress:(HttpProgress)progress andWhenSuccess:(RequestSuccess)success andWhenFailure:(RequestFailed)failure;
/**
下載文件
@param URL 下載路徑
@param fileDir 保存路徑
@param progress 下載進度
@param success 下載成功
@param failure 下載失敗
@return 下載任務
*/
+ (NSURLsessionTask *)downloadWithURL:(NSString *)URL fileDir:(NSString *)fileDir progress:(HttpProgress)progress success:(void(^)(NSString *))success failure:(RequestFailed)failure;
/**
獲取緩存大小
@return 緩存大小的字符串
*/
+(NSString *)getCacheSize;
/**
移除所有緩存
*/
+(void)removeAllCache;
@end
/
NetworkManager.m
#import "NetworkManager.h"
#import "AFNetworking.h"
#import <YYCache.h>
#import "SDImageCache.h"
@implementation NetworkManager
static AFHTTPSessionManager *_sessionManager =nil;
static GetNetworkStatus _networkStatus;
static NSString *const _NetworkResponseCache =@"NetworkRequestCache";
static YYCache *_dataCache;
/**
開始監聽網絡狀態
*/
+(void)startGetNetworkStatus{
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status)
{
case AFNetworkReachabilityStatusUnknown:
_networkStatus(NetworkStatusUnknown);
break;
case AFNetworkReachabilityStatusNotReachable:
_networkStatus(NetworkStatusNotReachable);
break;
//手機自帶網絡
case AFNetworkReachabilityStatusReachableViaWWAN:
_networkStatus(NetworkStatusReachableViaWWAN);
break;
//Wifi
case AFNetworkReachabilityStatusReachableViaWiFi:
_networkStatus(NetworkStatusReachableViaWiFi);
break;
}
}];
[manager startMonitoring];
}
/**
獲取網絡狀態
@param status 獲取網絡狀態的Block
*/
+(void)networkStatusWithBlock:(GetNetworkStatus)status{
_networkStatus = status;
}
//****************************不帶緩存的GET和POST請求
//使用GET方法獲取數據
+(void)startRequestGetWithurl:(NSString *)urlStr whenSuccess:(RequestSuccess)success andFailure:(RequestFailed)failure{
AFHTTPSessionManager *manager = [self createAFHTTPSessionManager];
[manager GET:urlStr parameters:nil progress:^(NSProgress *_Nonnull downloadProgress) {
}
success:^(NSURLSessionDataTask * _Nonnull task,id _Nullable responseObject) {
if (success) {
success(responseObject);
}
}
failure:^(NSURLSessionDataTask * _Nullable task, NSError *_Nonnull error) {
if (failure) {
failure(error);
}
}];
}
//使用POST方法獲取數據
+(void)startRequestWithurl:(NSString *)urlStr andParams:(NSDictionary *)params whenSuccess:(RequestSuccess)success andFailure:(RequestFailed)failure{
AFHTTPSessionManager *manager = [self createAFHTTPSessionManager];
[manager POST:urlStr parameters:params progress:^(NSProgress *_Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task,id _Nullable responseObject) {
if (success) {
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError *_Nonnull error) {
if (failure) {
failure(error);
}
}];
}
//**************************帶緩存GET和POST請求
//使用GET方法獲取數據
+(void)startRequestGetWithurl:(NSString *)urlStr andRequestCache:(RequestCache)requestCache whenSuccess:(RequestSuccess)success andFailure:(RequestFailed)failure{
AFHTTPSessionManager *manager = [self createAFHTTPSessionManager];
if (requestCache) {
requestCache([self getResponseCacheForKey:urlStr]);
}
[manager GET:urlStr parameters:nil progress:^(NSProgress *_Nonnull downloadProgress) {
}
success:^(NSURLSessionDataTask * _Nonnull task,id _Nullable responseObject) {
if (success) {
success(responseObject);
}
[self saveResponseCache:responseObject forKey:urlStr];
}
failure:^(NSURLSessionDataTask * _Nullable task, NSError *_Nonnull error) {
if (failure) {
failure(error);
}
}];
}
//使用POST方法獲取數據
+(void)startRequestWithurl:(NSString *)urlStr andRequestCache:(RequestCache)requestCache andParams:(NSDictionary *)params whenSuccess:(RequestSuccess)success andFailure:(RequestFailed)failure{
AFHTTPSessionManager *manager = [self createAFHTTPSessionManager];
if (requestCache) {
requestCache([self getResponseCacheForKey:urlStr]);
}
[manager POST:urlStr parameters:params progress:^(NSProgress *_Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task,id _Nullable responseObject) {
if (success) {
success(responseObject);
}
[self saveResponseCache:responseObject forKey:urlStr];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError *_Nonnull error) {
if (failure) {
failure(error);
}
}];
}
//上傳單張圖片
+(void)uploadImageWithUrl:(NSString *)urlStr andParm:(NSDictionary *)parm andImage:(UIImage *)image andWhenSuccess:(RequestSuccess)success andWhenFailure:(RequestFailed)failure{
NSData *imageData =UIImagePNGRepresentation(image);
AFHTTPSessionManager *manager = [selfcreateAFHTTPSessionManager];
// 給圖片重命名
NSDateFormatter *formatter = [[NSDateFormatteralloc] init];
formatter.dateFormat =@"yyyyMMddHHmmss";
NSString *str = [formatterstringFromDate:[NSDatedate]];
NSString *fileName = [NSStringstringWithFormat:@"%@.png", str];
[manager POST:urlStrparameters:parm constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
// 上傳文件
[formData appendPartWithFileData:imageDataname:@"file"fileName:fileName mimeType:@"image/png"];
} progress:^(NSProgress *_Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
NSDictionary *dic = [NSJSONSerializationJSONObjectWithData:responseObjectoptions:NSJSONReadingMutableContainerserror:nil];
if (success) {
success(dic);
}
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
if (failure) {
failure(error);
}
}];
}
//上傳多張圖片
+(void)uploadImageArrayWithUrl:(NSString *)urlStr andParm:(NSDictionary *)parm andImage:(NSArray <UIImage *> *)imageArr andProgress:(HttpProgress)progress andWhenSuccess:(RequestSuccess)success andWhenFailure:(RequestFailed)failure{
AFHTTPSessionManager *manager = [selfcreateAFHTTPSessionManager];
NSDateFormatter *formatter = [[NSDateFormatteralloc] init];
formatter.dateFormat =@"yyyyMMddHHmmss";
NSString *str = [formatterstringFromDate:[NSDatedate]];
NSString *fileName = [NSStringstringWithFormat:@"%@.png", str];
[manager POST:urlStrparameters:parm constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
//壓縮-添加-上傳圖片
[imageArr enumerateObjectsUsingBlock:^(UIImage *_Nonnull image, NSUInteger idx,BOOL * _Nonnull stop) {
NSData *imageData =UIImageJPEGRepresentation(image, 0.5);
[formData appendPartWithFileData:imageDataname:@"file"fileName:[NSStringstringWithFormat:@"%@%ld.png",fileName,idx]mimeType:@"image/png"];
}];
} progress:^(NSProgress *_Nonnull uploadProgress) {
//上傳進度
if (progress) {
progress(uploadProgress);
}
} success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
if (success) {
success(responseObject);
}
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
[UIapplicationsharedApplication].networkActivityIndicatorVisible =NO;
if (failure) {
failure(error);
}
}];
}
//下載文件
+ (NSURLSessionTask *)downloadWithURL:(NSString *)URL fileDir:(NSString *)fileDir progress:(HttpProgress)progress success:(void(^)(NSString *))success failure:(RequestFailed)failure
{
[UIApplicationsharedApplication].networkActivityIndicatorVisible =YES;
AFHTTPSessionManager *manager = [selfcreateAFHTTPSessionManager];
NSURLRequest *request = [NSURLRequestrequestWithURL:[NSURLURLWithString:URL]];
NSURLSessionDownloadTask *downloadTask = [managerdownloadTaskWithRequest:request progress:^(NSProgress *_Nonnull downloadProgress) {
//下載進度
if (progress) {
progress(downloadProgress);
// NSLog(@"下載進度:%.2f%%",100.0*downloadProgress.completedUnitCount/downloadProgress.totalUnitCount);
}
} destination:^NSURL *_Nonnull(NSURL *_Nonnull targetPath, NSURLResponse *_Nonnull response) {
//拼接緩存目錄
NSString *downloadDir = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:fileDir ? fileDir :@"Download"];
//打開文件管理器
NSFileManager *fileManager = [NSFileManagerdefaultManager];
//創建Download目錄
[fileManager createDirectoryAtPath:downloadDirwithIntermediateDirectories:YESattributes:nilerror:nil];
//拼接文件路徑
NSString *filePath = [downloadDirstringByAppendingPathComponent:response.suggestedFilename];
//返回文件位置的URL路徑
return [NSURLfileURLWithPath:filePath];
} completionHandler:^(NSURLResponse *_Nonnull response, NSURL *_Nullable filePath, NSError *_Nullable error) {
//下載成功返回下載路徑
success ? success(filePath.absoluteString) :nil;
failure && error ? failure(error) : nil;
}];
//開始下載
[downloadTask resume];
return downloadTask;
}
//緩存操作在程序運行過程中,它會在你程序中每個類調用一次initialize初始化 _dataCache
+ (void)initialize
{
_dataCache = [YYCachecacheWithName:_NetworkResponseCache];
[_dataCache.memoryCachesetCountLimit:50];//內存最大緩存數據個數
[_dataCache.memoryCachesetCostLimit:1*1024];//內存最大緩存開銷目前這個毫無用處
[_dataCache.diskCachesetCostLimit:10*1024];//磁盤最大緩存開銷
[_dataCache.diskCachesetCountLimit:50];//磁盤最大緩存數據個數
[_dataCache.diskCachesetAutoTrimInterval:60];//設置磁盤lru動態清理頻率默認 60秒
}
+ (void)saveResponseCache:(id)responseCache forKey:(NSString *)key
{
//異步緩存,不會阻塞主線程
[_dataCachesetObject:responseCache forKey:keywithBlock:nil];
}
+ (id)getResponseCacheForKey:(NSString *)key
{
//NSLog(@"磁盤緩存位置%@",_dataCache.diskCache.path);
return [_dataCacheobjectForKey:key];
}
+(NSString *)getCacheSize{
NSUInteger imageCacheSize = [[SDImageCachesharedImageCache] getSize];
NSInteger totalSize =_dataCache.memoryCache.totalCost +_dataCache.diskCache.totalCost + imageCacheSize;
NSString *totalSizeStr;
if (totalSize < 1024) {
totalSizeStr = [NSStringstringWithFormat:@"%ldB",totalSize];
}elseif (totalSize>=1024&&totalSize<1024*1024){
totalSizeStr = [NSStringstringWithFormat:@"%.2fKB",totalSize/1024.0];
}elseif(totalSize > 1024*1024) {
totalSizeStr = [NSStringstringWithFormat:@"%.2fMB",totalSize/(1024.0*1024)];
}
return totalSizeStr;
}
+(void)removeAllCache{
[[SDImageCachesharedImageCache] clearDisk];
[_dataCache.diskCacheremoveAllObjects];
[_dataCache.memoryCacheremoveAllObjects];
}
#pragma mark - 設置AFHTTPSessionManager相關屬性
+ (AFHTTPSessionManager *)createAFHTTPSessionManager
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//設置請求參數的類型:HTTP (AFJSONRequestSerializer,AFHTTPRequestSerializer)
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
//設置請求的超時時間
manager.requestSerializer.timeoutInterval = 30.f;
//設置服務器返回結果的類型:JSON (AFJSONResponseSerializer,AFHTTPResponseSerializer)
manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json", @"text/javascript",@"text/html",@"text/plain",nil];
return manager;
}
@end
新聞熱點
疑難解答