AFNetworking 3.0封装

导语

在上家公司,网络请求一直是AFNetworking2.0,现在该升级了!话不多说,直接开始咱们自己的WebRequest啦!

结构

延续了2.0的习惯,这次封装这采用了简单的二次封装WebRequestManager (负责缓存)WebRequestSession(负责请求),分别进行了GET、POST、Upload(2.0分开写,3.0合并了)、Download

WebRequestSession

  • AFHTTPSessionManager懒加载

    - (AFHTTPSessionManager *)requestManager {
    
       if (_requestManager == nil) {
      
      _requestManager = [[AFHTTPSessionManager alloc] initWithBaseURL:BaseUrl];
      
      _requestManager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain" ,@"application/json", @"text/json", @"text/javascript",@"text/html",@"image/png",@"image/jpeg",@"application/rtf",@"image/gif",@"application/zip",@"audio/x-wav",@"image/tiff",@"   application/x-shockwave-flash",@"application/vnd.ms-powerpoint",@"video/mpeg",@"video/quicktime",@"application/x-javascript",@"application/x-gzip",@"application/x-gtar",@"application/msword",@"text/css",@"video/x-msvideo",@"text/xml", nil];
      
      switch ([WebRequestManager sharedWebRequestManager].requestSerializerType) {
      
          case RequestSerializerTypeForm:
          
              _requestManager.requestSerializer = [AFHTTPRequestSerializer serializer];
              break;
              
          case RequestSerializerTypeJSON:
              
              _requestManager.requestSerializer = [AFJSONRequestSerializer serializer];
              break;
              
          default:
              
              _requestManager.requestSerializer = [AFHTTPRequestSerializer serializer];
              break;
      }
      
      switch ([WebRequestManager sharedWebRequestManager].responseSerializerType) {
              
          case ResponseSerializerTypeHTTP:
              
              _requestManager.responseSerializer = [AFHTTPResponseSerializer serializer];
              break;
              
          case ResponseSerializerTypeJSON:
              
              _requestManager.responseSerializer = [AFJSONResponseSerializer serializer];
              break;
              
          default:
              
              _requestManager.responseSerializer = [AFJSONResponseSerializer serializer];
              break;
      }
      
      _requestManager.requestSerializer.timeoutInterval = 30.f;
      
       }
     return _requestManager;
    }
    
  • GET请求
    - (void) getDataWithURLString:(NSString *)URLString
    WithParams:(id)params
    success:(void(^)(id dic))success
    failure:(void(^)(NSError *error))failure {

     [self.requestManager GET:URLString parameters:params progress:^(NSProgress * _Nonnull downloadProgress) {
      
      NSLog(@"%f",downloadProgress.fractionCompleted);
     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
      
      if (success) {
          success(responseObject);
      }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
      
      if (failure) {
          failure(error);
      }
    }];
    }
    
  • POST请求
    - (void) postDataWithURLString:(NSString *)URLString
    WithParams:(id)params
    success:(void(^)(id dic))success
    failure:(void(^)(NSError *error))failure {

    [self.requestManager POST:URLString parameters:params progress:^(NSProgress * _Nonnull uploadProgress) {
      
      NSLog(@"%f",uploadProgress.fractionCompleted);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
      
      if (success) {
          success(responseObject);
      }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
      
      if (failure) {
          failure(error);
      }
    }];
    }
    
  • Upload请求
    - (void) uploadFileWithURLString:(NSString *)URLString
    WithParams:(id)params
    data:(NSData *)data
    name:(NSString *)name
    fileName:(NSString *)fileName
    success:(void(^)(id dic))success
    failure:(void(^)(NSError *error))failure
    fractionCompleted:(void(^)(double count))fractionCompleted {

     [self.requestManager POST:URLString parameters:params constructingBodyWithBlock:^(id  _Nonnull formData) {
      
      [formData appendPartWithFileData:data name:name fileName:fileName mimeType:@"application/octet-stream"];
      
      } progress:^(NSProgress * _Nonnull uploadProgress) {
      
      if (fractionCompleted) {
          
          fractionCompleted(uploadProgress.fractionCompleted);
      }
     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
      
      if (success) {
          success(responseObject);
      }
      } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
      
      if (failure) {
          failure(error);
      }
      }];
    }
    
  • DownLoad请求
    - (void) downloadFileWithURLString:(NSString *)URLString
    fileDownPath:(NSString *)fileDownPath
    success:(void(^)(id dic))success
    failure:(void(^)(NSError *error))failure
    fractionCompleted:(void(^)(double count))fractionCompleted {

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:URLString]];
    
     NSURLSessionDownloadTask *downloadTask =  [self.requestManager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
      
      if (fractionCompleted) {
          
          fractionCompleted(downloadProgress.fractionCompleted);
      }
      
     } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
      
      NSURL *documentsDirectoryURL = [NSURL fileURLWithPath:fileDownPath];
      
      NSLog(@"%@",documentsDirectoryURL);
      
      return documentsDirectoryURL;
    
     } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
      
      if (!error) {
          
          if (success) {
              
              success(filePath);
          }
      }else {
      
          if (failure) {
              
              failure(error);
          }
      }
      
      }];
     [downloadTask resume];
    }
    
  • 取消请求
    - (void)cancelRequest {

      [self.requestManager.operationQueue cancelAllOperations];
     }
    

WebRequestManager

这里面GET和POST需缓存,这里以GET为例,详细看demo

  • 初始化操作缓存池
    // 初始化操作缓存池
    - (NSMutableDictionary *)operationCachePool {

      if (_operationCachePool == nil) {
      
      _operationCachePool = [[NSMutableDictionary alloc] init];
    
     }
     return _operationCachePool;
    }
    
  • GET请求
    - (void) getDataWithURLString:(NSString *)URLString
    WithParams:(id)params
    success:(void(^)(id dic))success
    failure:(void(^)(NSError *error))failure {

     URLString = [self beforeRequestWithSettingWithURLString:URLString];
    
     WebRequestSession *requestSession = [[WebRequestSession alloc]init];
    
    [self.operationCachePool setObject:requestSession forKey:URLString];
    
    self.webRequestSession = requestSession;
    
    [requestSession getDataWithURLString:URLString WithParams:params success:^(id dic) {
      
      [self setReturnSuccessWithSuccess:success URLString:URLString returnData:dic];
      
    } failure:^(NSError *error) {
      
      [self BlockWith:error success:success failure:failure];
    
    }];
    }
    

// 请求数据成功,返回数据
- (void) setReturnSuccessWithSuccess:(void(^)(id dic))success URLString:(NSString *)URLString returnData:(id)dic {

  if ([self.operationCachePool objectForKey:self.webTask]) {
    
    [self.operationCachePool removeObjectForKey:self.webTask];

  }

  NSString *hash = [self.webTask md5String];

  NSString *filePath = [self pathForDocumentWithComponent:hash];

  NSData *data = [[Transformer sharedTransformer] returnDataWithDictionary:dic];

  [data writeToFile:filePath atomically:YES];

  if (success) {
    
    success(dic);
  }

  [self.operationCachePool removeObjectForKey:URLString];

  }

// 请求数据失败,有缓存取缓存,没缓存返回error
- (void)BlockWith:(NSError*)error success:(void(^)(id dic))success failure:(void(^)(NSError *error))failure {

  if (self.isCanceled) {
    
    self.isCanceled = NO;
    
    if (failure) {
        
        failure(error);
    }
    
  }else{
    
    NSLog(@"%@",self.webTask);
    
    NSString *hash = [self.webTask md5String];
    
    NSString *filePath = [self pathForDocumentWithComponent:hash];
    
    NSLog(@"%@",filePath);
    
    NSDictionary *dic = [[Transformer sharedTransformer] returnDictionaryWithDataPath:filePath];
    
    if(dic){
        
        NSLog(@"%@",dic);
        
        if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
            
            if (success) {
                
                success(dic);
            }
            
            NSLog(@"网络不畅,缓存中取~~~~~~~~");
        }
        
    }else {
        
        NSLog(@"%@~~~",dic);
        
        if (failure) {
            
            failure(error);
        }
    }
  }    
  }

// 获取沙盒路径
- (NSString *)pathForDocumentWithComponent:(NSString *)fid {

   NSString *fullPath = nil;

  if (fid&& [fid length]) {
    
    NSString *path = NSHomeDirectory();
    
    NSString *cacheDiretory= [path stringByAppendingPathComponent:@"Library/Caches/"];
    
    cacheDiretory = [cacheDiretory stringByAppendingPathComponent:@"webCache"];
    
    fullPath = [cacheDiretory stringByAppendingPathComponent:fid];
    
  } else {
    
    fullPath = kWebCachePath;
    
  }

  NSFileManager *fileManager = [NSFileManager defaultManager];

  if (![fileManager fileExistsAtPath:fullPath]) {
    
    NSError *err=nil;
    
    if ([fileManager createDirectoryAtPath:fullPath withIntermediateDirectories:YES attributes:nil error:&err]) {
        
        return [fullPath stringByAppendingPathComponent:fid];
        
    }else{
        
        [fileManager createDirectoryAtPath:fullPath withIntermediateDirectories:YES attributes:nil error:&err];
        
        return [fullPath stringByAppendingPathComponent:fid];
      }
  }

  fullPath = [fullPath stringByAppendingPathComponent:fid];

  return fullPath;

  }

// 获取当前时间
- (NSString*)getDate {

  NSDate* now = [NSDate date];

  NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 

  [dateFormatter setDateFormat:@"yyyy/MM/dd  HH:mm:ss"];

  NSLog(@"%@",[dateFormatter stringFromDate:now]);

  return [dateFormatter stringFromDate:now];

  }

效果图

AFNetworking 3.0封装_第1张图片
效果图.gif

结束语

新公司注重开源,以后我自己研发的,或者整理的,只要是好东西,我一般都会分享到这的!

你可能感兴趣的:(AFNetworking 3.0封装)