欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

IOS網絡請求之AFNetWorking3.x使用詳情

前言:

創(chuàng)新互聯(lián)建站為您提適合企業(yè)的網站設計?讓您的網站在搜索引擎具有高度排名,讓您的網站具備超強的網絡競爭力!結合企業(yè)自身,進行網站設計及把握,最后結合企業(yè)文化和具體宗旨等,才能創(chuàng)作出一份性化解決方案。從網站策劃到成都網站設計、成都網站制作, 我們的網頁設計師為您提供的解決方案。

計劃把公司的網絡請求與業(yè)務解耦,所以想著學習一下網絡請求,最近學習了NSURLSession,今天來學習一下基于NSURLSession封裝的優(yōu)秀開源框架AFNetWorking 3.x,之前13年做iOS開發(fā)時用的ASIHttpRequest開源框架。

AFNetWorking

AFNetWorking一款輕量級網絡請求開源框架,基于iOS和mac os 網絡進行擴展的高性能框架,大大降低了iOS開發(fā)工程師處理網絡請求的難度,讓iOS開發(fā)變成一件愉快的事情。

下載地址:AFNetworking_jb51.rar

1.)AFHTTPSessionManager請求管理者

-(AFHTTPSessionManager *)sharedManager
{
  AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  //最大請求并發(fā)任務數
  manager.operationQueue.maxConcurrentOperationCount = 5;

  // 請求格式
  // AFHTTPRequestSerializer      二進制格式
  // AFJSONRequestSerializer      JSON
  // AFPropertyListRequestSerializer  PList(是一種特殊的XML,解析起來相對容易)
  
  manager.requestSerializer = [AFHTTPRequestSerializer serializer]; // 上傳普通格式
  
  // 超時時間
  manager.requestSerializer.timeoutInterval = 30.0f;
  // 設置請求頭
  [manager.requestSerializer setValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];
  // 設置接收的Content-Type
  manager.responseSerializer.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/xml", @"text/xml",@"text/html", @"application/json",@"text/plain",nil];
  
  // 返回格式
  // AFHTTPResponseSerializer      二進制格式
  // AFJSONResponseSerializer      JSON
  // AFXMLParserResponseSerializer   XML,只能返回XMLParser,還需要自己通過代理方法解析
  // AFXMLDocumentResponseSerializer (Mac OS X)
  // AFPropertyListResponseSerializer  PList
  // AFImageResponseSerializer     Image
  // AFCompoundResponseSerializer    組合
  
  manager.responseSerializer = [AFJSONResponseSerializer serializer];//返回格式 JSON
  //設置返回C的ontent-type
  manager.responseSerializer.acceptableContentTypes=[[NSSet alloc] initWithObjects:@"application/xml", @"text/xml",@"text/html", @"application/json",@"text/plain",nil];

  return manager;
}

2.)處理get請求

-(void)doGetRequest
{
  //創(chuàng)建請求地址
  NSString *url=@"http://api.nohttp.net/method";
  //構造參數
  NSDictionary *parameters=@{@"name":@"yanzhenjie",@"pwd":@"123"};
  //AFN管理者調用get請求方法
  [[self shareAFNManager] GET:url parameters:parameters progress:^(NSProgress * _Nonnull downloadProgress) {
    //返回請求返回進度
    NSLog(@"downloadProgress-->%@",downloadProgress);
  } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
    //請求成功返回數據 根據responseSerializer 返回不同的數據格式
    NSLog(@"responseObject-->%@",responseObject);
  } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    //請求失敗
    NSLog(@"error-->%@",error);
  }];
}

3.)處理post請求

-(void)doPostRequestOfAFN
{
  //創(chuàng)建請求地址
  NSString *url=@"http://api.nohttp.net/postBody";
  //構造參數
  NSDictionary *parameters=@{@"name":@"yanzhenjie",@"pwd":@"123"};
  //AFN管理者調用get請求方法
  [[self shareAFNManager] POST:url parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
    //返回請求返回進度
    NSLog(@"downloadProgress-->%@",uploadProgress);
  } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
    //請求成功返回數據 根據responseSerializer 返回不同的數據格式
    NSLog(@"responseObject-->%@",responseObject);
  } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    //請求失敗
    NSLog(@"error-->%@",error);
  }];
}

4.)處理文件上傳

-(void)doUploadRequest
{
  // 創(chuàng)建URL資源地址
  NSString *url = @"http://api.nohttp.net/upload";
  // 參數
  NSDictionary *parameters=@{@"name":@"yanzhenjie",@"pwd":@"123"};
  [[self shareAFNManager] POST:url parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
    NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:0];
    NSTimeInterval a=[dat timeIntervalSince1970];
    NSString* fileName = [NSString stringWithFormat:@"file_%0.f.txt", a];
    
    [FileUtils writeDataToFile:fileName data:[@"upload_file_to_server" dataUsingEncoding:NSUTF8StringEncoding]];
    // 獲取數據轉換成data
    NSString *filePath =[FileUtils getFilePath:fileName];
    // 拼接數據到請求題中
    [formData appendPartWithFileURL:[NSURL fileURLWithPath:filePath] name:@"headUrl" fileName:fileName mimeType:@"application/octet-stream" error:nil];
    
  } progress:^(NSProgress * _Nonnull uploadProgress) {
    // 上傳進度
    NSLog(@"%lf",1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
  } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
    //請求成功
    NSLog(@"請求成功:%@",responseObject);
    
  } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    //請求失敗
    NSLog(@"請求失?。?@",error);
  }];
}

5.)處理文件下載

-(void)doDownLoadRequest
{
  NSString *urlStr =@"/upload/otherpic55/122374.png";
  // 設置請求的URL地址
  NSURL *url = [NSURL URLWithString:urlStr];
  // 創(chuàng)建請求對象
  NSURLRequest *request = [NSURLRequest requestWithURL:url];
  // 下載任務
  NSURLSessionDownloadTask *task = [[self shareAFNManager] downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
    // 下載進度
    NSLog(@"當前下載進度為:%lf", 1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
  } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
    // 下載地址
    NSLog(@"默認下載地址%@",targetPath);
    //這里模擬一個路徑 真實場景可以根據url計算出一個md5值 作為fileKey
    NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:0];
    NSTimeInterval a=[dat timeIntervalSince1970];
    NSString* fileKey = [NSString stringWithFormat:@"/file_%0.f.txt", a];
    // 設置下載路徑,通過沙盒獲取緩存地址,最后返回NSURL對象
    NSString *filePath = [FileUtils getFilePath:fileKey];
    return [NSURL fileURLWithPath:filePath]; // 返回的是文件存放在本地沙盒的地址
  } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
    // 下載完成調用的方法
    NSLog(@"filePath---%@", filePath);
    NSData *data=[NSData dataWithContentsOfURL:filePath];
    UIImage *image=[UIImage imageWithData:data];
    // 刷新界面...
    UIImageView *imageView =[[UIImageView alloc]init];
    imageView.image=image;
    [self.view addSubview:imageView];
    [imageView mas_makeConstraints:^(MASConstraintMaker *make) {
      make.center.equalTo(self.view);
      make.size.mas_equalTo(CGSizeMake(300, 300));
    }];
  }];
  //啟動下載任務
  [task resume];
}

6.)網絡狀態(tài)監(jiān)聽

- (void)aFNetworkStatus{
  
  //創(chuàng)建網絡監(jiān)測者
  AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
  
  /*枚舉里面四個狀態(tài) 分別對應 未知 無網絡 數據 WiFi
   typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
   AFNetworkReachabilityStatusUnknown     = -1,   未知
   AFNetworkReachabilityStatusNotReachable   = 0,    無網絡
   AFNetworkReachabilityStatusReachableViaWWAN = 1,    蜂窩數據網絡
   AFNetworkReachabilityStatusReachableViaWiFi = 2,    WiFi
   };
   */
  
  [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    //這里是監(jiān)測到網絡改變的block 可以寫成switch方便
    //在里面可以隨便寫事件
    switch (status) {
      case AFNetworkReachabilityStatusUnknown:
        NSLog(@"未知網絡狀態(tài)");
        break;
      case AFNetworkReachabilityStatusNotReachable:
        NSLog(@"無網絡");
        break;
        
      case AFNetworkReachabilityStatusReachableViaWWAN:
        NSLog(@"蜂窩數據網");
        break;
        
      case AFNetworkReachabilityStatusReachableViaWiFi:
        NSLog(@"WiFi網絡");
        break;
        
      default:
        break;
    }
    
  }] ;
  
  [manager startMonitoring];
}

AFNetWorking內存泄露

 通常情況我們一般會認為以manager結尾的都是單例模式,所以我們一般都是這樣使用AFNetWorking,如下

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

其實我們點進去查看源碼發(fā)現并不是單例,而是每次都實例化一個AFHTTPSessionManager對象,源碼如下

+ (instancetype)manager {
  return [[[self class] alloc] initWithBaseURL:nil];
}

所以我們在使用AFNetWorking的時候要對AFHTTPSessionManager進行單例封裝

+ (AFHTTPSessionManager *)sharedManager
{
  static AFHTTPSessionManager *manager = nil;
  static dispatch_once_t predicate;
  dispatch_once(&predicate, ^{
    manager = [AFHTTPSessionManager manager];
    manager.operationQueue.maxConcurrentOperationCount = 5;
    manager.requestSerializer.timeoutInterval=30.f;
    manager.responseSerializer.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/xml", @"text/xml",@"text/html", @"application/json",@"text/plain",nil];
    [manager.requestSerializer setValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];
    
  });
  return manager;
}

AFNetWorking關于HTTPS

 在2017年1月1日起Apple 要求開發(fā)者于年底之前為提交至 App Store 中的應用啟用 HTTPS ,以支持 iOS 9 引入的 ATS(App Transport Security)技術。但后來,apple 發(fā)布聲明宣布延長這個時限,提供給開發(fā)者更多的時間進行相關準備。目前 Apple 尚未公布新的截止日期。所以目前應對https的方案有兩種。

第一種方式:

屏蔽調iOS ATS(App Transport Security),在pList.info文件中添加如下代碼

<key>NSAppTransportSecurity</key> 
  <dict> 
    <key>NSAllowsArbitraryLoads</key> 
    <true/> 
 </dict> 

第二種方式:

配置https CA證書,這里采用獲取NSBundle中獲取CA證書,AFNetWorking提供了配置AFSecurityPolicy模塊

+ (AFSecurityPolicy *)customSecurityPolicy{
  //Https CA證書地址
  NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"XueLeTSHTTPS" ofType:@"cer"];
  //獲取CA證書數據
  NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
  //創(chuàng)建AFSecurityPolicy對象
  AFSecurityPolicy *security = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
  //設置是否允許不信任的證書(證書無效、證書時間過期)通過驗證 ,默認為NO.
  security.allowInvalidCertificates = YES;
  //是否驗證域名證書的CN(common name)字段。默認值為YES。
  security.validatesDomainName = NO;
  //根據驗證模式來返回用于驗證服務器的證書
  security.pinnedCertificates = [NSSet setWithObject:cerData];
  return security;
}

然后通過設置AFHTTPSessionManager的securityPolicy屬性等于自定義的AFSecurityPolicy。

總結:

簡單記錄一下AFNetWorking的基本使用,方便以后查找。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

本文名稱:IOS網絡請求之AFNetWorking3.x使用詳情
當前URL:http://www.aaarwkj.com/article8/gjgiip.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、域名注冊、營銷型網站建設、網站導航定制開發(fā)、外貿建站

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
日本高清有码视频在线观看| 欧美午夜福利一级高清| 成人黄片在线免费播放| 国产日产精品一区二区三区四区| 久久精品人妻少妇一区二| 成人性生活视频免费中文版| 免费精品一区二区三区欧美| 日韩在线视频观看一区二区三区 | 日本不卡一区二区视频| 国产传媒在线播放一区| 亚洲不卡一区二区在线| 98精品熟女亚洲av| 男女搞j视频网站免费观看| 精品日韩电影在线观看| 国产天堂亚洲国产碰碰| 大片天天看菲色亚洲黄色| 欧美日韩亚洲国产三级| 国产传媒网站在线观看| 乡村丰满的大屁股熟妇| av国语对白在线观看| 十八女毛片一区二区三区| 国产看片色网站亚洲av| 手机看片黄色福利视频91| 国产精品超碰在线观看| 伊人久久九九精品综合| 中文字幕中文字幕乱码| 亚洲国产精品中文字幕久久| 日本精品av一区二区| 久久亚洲av电影网站| 一区二区三区高清人妻| 亚洲一品道在线观看| 中文字幕人妻系列东京热| 日本精品专区在线观看| 国自产偷精品不卡在线| 婷婷人妻中文字幕在线| 九九久久亚洲av成人乱片| 日本中文字幕有码专区| 久草手机福利在线观看| 久久99精品久久久国产| 少妇的诱惑免费在线播放| 久久综合中文字幕一区|