AFNetworking 3.0封装

作者: 欢欢1206 | 来源:发表于2016-03-31 17:35 被阅读1514次

    导语

    在上家公司,网络请求一直是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<AFMultipartFormData>  _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];
    
      }
    

    效果图

    效果图.gif

    结束语

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

    相关文章

      网友评论

      本文标题:AFNetworking 3.0封装

      本文链接:https://www.haomeiwen.com/subject/lcwelttx.html