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<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

结束语

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容