AFNetworking 3.0封裝

導語

在上家公司,網(wǎng)絡請求一直是AFNetworking2.0器虾,現(xiàn)在該升級了讯嫂!話不多說,直接開始咱們自己的WebRequest啦兆沙!

結構

延續(xù)了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];
    
    }];
    }
    

// 請求數(shù)據(jù)成功褥符,返回數(shù)據(jù)
- (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];

  }

// 請求數(shù)據(jù)失敗龙誊,有緩存取緩存,沒緩存返回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(@"網(wǎng)絡不暢属瓣,緩存中取~~~~~~~~");
        }
        
    }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

結束語

新公司注重開源载迄,以后我自己研發(fā)的讯柔,或者整理的抡蛙,只要是好東西安吁,我一般都會分享到這的击蹲!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘲碧,一起剝皮案震驚了整個濱河市赡磅,隨后出現(xiàn)的幾起案子文狱,更是在濱河造成了極大的恐慌批幌,老刑警劉巖女淑,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憨颠,死亡現(xiàn)場離奇詭異湿酸,居然都是意外死亡婿屹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門推溃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昂利,“玉大人,你說我怎么就攤上這事铁坎》浼椋” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵硬萍,是天一觀的道長扩所。 經(jīng)常有香客問我,道長朴乖,這世上最難降的妖魔是什么祖屏? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任助赞,我火速辦了婚禮,結果婚禮上袁勺,老公的妹妹穿的比我還像新娘嫉拐。我一直安慰自己,他們只是感情好魁兼,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布婉徘。 她就那樣靜靜地躺著,像睡著了一般咐汞。 火紅的嫁衣襯著肌膚如雪盖呼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天化撕,我揣著相機與錄音几晤,去河邊找鬼。 笑死植阴,一個胖子當著我的面吹牛蟹瘾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掠手,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼憾朴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了喷鸽?” 一聲冷哼從身側響起众雷,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎做祝,沒想到半個月后砾省,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡混槐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年编兄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片声登。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡狠鸳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捌刮,到底是詐尸還是另有隱情碰煌,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布绅作,位于F島的核電站芦圾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏俄认。R本人自食惡果不足惜个少,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一洪乍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夜焦,春花似錦壳澳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卸伞,卻和暖如春抹镊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荤傲。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工垮耳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人遂黍。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓终佛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雾家。 傳聞我的和親對象是個殘疾皇子铃彰,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容