自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

iOS網(wǎng)絡(luò)請(qǐng)求相關(guān)框架的使用

移動(dòng)開發(fā)
關(guān)于iOS相關(guān)技術(shù)的博客非常非常多了,沒有好的內(nèi)容也不想寫,最近在迭代公司項(xiàng)目版本,對(duì)于這個(gè)題材也想了很久,看了很多類似的文章,決定記錄一下。網(wǎng)絡(luò)請(qǐng)求,是客戶端開發(fā)中一個(gè)很重要的模塊,關(guān)于此方面需要了解的東西也是非常多的,此篇文章僅介紹自己用過的有關(guān)框架。

關(guān)于iOS相關(guān)技術(shù)的博客非常非常多了,沒有好的內(nèi)容也不想寫,最近在迭代公司項(xiàng)目版本,對(duì)于這個(gè)題材也想了很久,看了很多類似的文章,決定記錄一下。網(wǎng)絡(luò)請(qǐng)求,是客戶端開發(fā)中一個(gè)很重要的模塊,關(guān)于此方面需要了解的東西也是非常多的,此篇文章僅介紹自己用過的有關(guān)框架。

AFNetworking

1. 關(guān)于AFNetworking

只要是做iOS開發(fā)的應(yīng)該都是知道這個(gè)框架的,有多優(yōu)秀我就不贅述了。自iOS9之后蘋果棄用了NSURLConnection只用NSURLSession,所以AFN從3.0版本開始就刪除了基于NSURLConnection API的所有支持,基于NSURLSession框架以及NSOperation進(jìn)行的封裝開發(fā)。

2. 基于AFNetworking進(jìn)行網(wǎng)絡(luò)請(qǐng)求

既然用的是第三方框架,那么肯定會(huì)有一些局限性??蚣艿牡露紩?huì)影響我們的代碼,所以盡可能解耦,一般我們都會(huì)單獨(dú)的寫一個(gè)網(wǎng)絡(luò)請(qǐng)求工具類對(duì)框架進(jìn)行封裝。這樣即使框架更改了,也只需要更改工具類相關(guān)代碼。

a.新建網(wǎng)絡(luò)請(qǐng)求工具類,實(shí)例化AFHTTPSessionManager。類似如下 :

  1. + (instancetype)sharedInstance 
  2.     static dispatch_once_t onceToken; 
  3.     dispatch_once(&onceToken, ^{ 
  4.         _mutParamares = [NSMutableDictionary dictionary]; 
  5.         _manager = [AFHTTPSessionManager manager]; 
  6.         _manager.requestSerializer = [AFHTTPRequestSerializer serializer]; 
  7.         _manager.requestSerializer.timeoutInterval = 30.0f; 
  8.         [AFNetworkActivityIndicatorManager sharedManager].enabled = YES; 
  9.         _manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html", @"text/json"
  10.                                                               @"text/plain", @"text/javascript", @"text/xml", @"image/*", nil]; 
  11.     }); 

兩個(gè)需要注意的問題:***,這里的網(wǎng)絡(luò)請(qǐng)求工具類是一個(gè)單利,為什么要用單利呢? [AFHTTPSessionManager manager]跟蹤到這個(gè)方法里,會(huì)看到返回的manager并不是單利,如果每次請(qǐng)求都實(shí)例化一個(gè)manager的話,那么有可能造成內(nèi)存泄漏。第二,有時(shí)候請(qǐng)求失敗的原因是AFN支持的response類型和服務(wù)器返回給我們的類型不一致,需要修改AFN的源碼進(jìn)行修改,但用Cocoapods來管理三方框架,pod update之后修改的代碼又會(huì)被重置。此時(shí),就可以通過acceptableContentTypes屬性來根據(jù)需要設(shè)置。

  1. + (instancetype)manager { 
  2.     return [[self alloc] initWithBaseURL:nil]; 

也可以通過requestSerializer屬性設(shè)置請(qǐng)求頭相關(guān)的信息。如:

  1. [self.manager.requestSerializer setValue:@"" forHTTPHeaderField:@""]; 

b.常用的網(wǎng)絡(luò)請(qǐng)求類型。這是對(duì)外的API,外部通過調(diào)用這些接口實(shí)現(xiàn)相關(guān)的網(wǎng)絡(luò)請(qǐng)求。當(dāng)然你也可以根據(jù)自己的需要暴露相關(guān)的API。相應(yīng)的接口實(shí)現(xiàn)比較簡(jiǎn)單。具體的邏輯還應(yīng)根據(jù)業(yè)務(wù)需求在外部實(shí)現(xiàn)。對(duì)于文件的操作,如圖片的上傳,可參考代碼如下。

iOS網(wǎng)絡(luò)請(qǐng)求相關(guān)框架的使用

  1. image.png 
  2.     // 上傳多張圖片 
  3.     [_manager POST:url parameters:param constructingBodyWithBlock:^(id<afmultipartformdata>  _Nonnull formData)  { 
  4.         for (UIImage *image in imgArray) { 
  5.             UIImage *resizeImage = image.reSizeImage; 
  6.             NSData *data  = UIImagePNGRepresentation(resizeImage); 
  7.             [formData appendPartWithFileData:data name: @"file" fileName:[NSString stringWithFormat:@"img%ld.png",i] mimeType:@"image/png"]; 
  8.     }];</afmultipartformdata> 

上傳多張圖片的時(shí)候,根據(jù)需要可對(duì)圖片進(jìn)行裁剪和壓縮。關(guān)于上傳的進(jìn)度可以通過progressBlock返回在對(duì)應(yīng)的UI上進(jìn)行顯示,進(jìn)度的計(jì)算公式如下。

  1. processBlock(progress.completedUnitCount / progress.totalUnitCount); 

c.監(jiān)測(cè)網(wǎng)絡(luò)狀態(tài)。

  1. AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; 
  2. [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
  3.     switch (status)  { 
  4.         case AFNetworkReachabilityStatusUnknown: break; 
  5.         case AFNetworkReachabilityStatusNotReachable: break; 
  6.         case AFNetworkReachabilityStatusReachableViaWWAN:  break; 
  7.         case AFNetworkReachabilityStatusReachableViaWiFi:  break; 
  8.     } 
  9. }]; 
  10. [manager startMonitoring]; 

以上是基于AFNetworking的網(wǎng)絡(luò)請(qǐng)求。上面說的這種網(wǎng)絡(luò)請(qǐng)求方式是集約式的網(wǎng)絡(luò)請(qǐng)求,也就是所有的API都調(diào)用的是這個(gè)工具類。還有一種網(wǎng)絡(luò)請(qǐng)求方式是離散式的,也就是每一個(gè)API都有自己對(duì)應(yīng)的類。

YTKNetwork

1. 關(guān)于YTKNetwork

這個(gè)框架也是基于AFNetworking進(jìn)行的再次封裝,適用于規(guī)模較大的項(xiàng)目中。YTKNetwork是離散式的網(wǎng)絡(luò)請(qǐng)求方式,如上所述,每一個(gè)請(qǐng)求都對(duì)應(yīng)一個(gè)對(duì)象,可根據(jù)需要對(duì)相應(yīng)的請(qǐng)求進(jìn)行定制化。另外YTKNetwork支持批量網(wǎng)絡(luò)請(qǐng)求發(fā)送并設(shè)置統(tǒng)一回調(diào)、支持相互依賴的網(wǎng)絡(luò)請(qǐng)求等等功能。

2. 基于YTKNetwork進(jìn)行網(wǎng)絡(luò)請(qǐng)求

a. 同上,不建議直接使用第三方,自己寫一個(gè)BaseRequest類繼承YTKRequest,在這個(gè)類里面實(shí)現(xiàn)下面這個(gè)方法。這個(gè)方法是所有請(qǐng)求的Response。

  1. - (void)startWithCompletionBlockWithSuccess:(YTKRequestCompletionBlock)success failure:(YTKRequestCompletionBlock)failure{} 

b. 寫一個(gè)網(wǎng)絡(luò)請(qǐng)求配置類。在程序啟動(dòng)的時(shí)候通過YTKNetworkConfig配置網(wǎng)絡(luò)請(qǐng)求。如baseUrl參數(shù)等。通過YTKNetworkAgent設(shè)置一些參數(shù),如上面提到的acceptableContentTypes參數(shù)。這個(gè)類是真正發(fā)起請(qǐng)求的類,也是在這個(gè)類中與AFN打交道。

 

  1. _config = [YTKNetworkConfig sharedConfig]; 
  2. _config.baseUrl = BASE_INTERFACE_URL_DEV; 
  3.  
  4.  YTKNetworkAgent *agent = [YTKNetworkAgent sharedAgent]; 
  5.  NSSet *acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/plain", @"text/html", @"text/css", nil]; 
  6.  NSString *keypath = @"jsonResponseSerializer.acceptableContentTypes"
  7. [agent setValue:acceptableContentTypes forKeyPath:keypath]; 

3.以一個(gè)具體的API(請(qǐng)求用戶信息)請(qǐng)求為例。

3.1 新建一個(gè)UserInfoAPI類,繼承你寫的BaseRequest類。

3.2 實(shí)現(xiàn)以下方法。請(qǐng)求的URL,和外部無關(guān),不需要外面?zhèn)鬟M(jìn)來。請(qǐng)求的類型,以及請(qǐng)求的參數(shù)。當(dāng)然,解析也可以在API類內(nèi)部實(shí)現(xiàn)。通過在GET方法里面實(shí)現(xiàn)數(shù)據(jù)的轉(zhuǎn)換和解析。

  1. - (NSString *)requestUrl { 
  2.     return kUserURL; 
  3. - (YTKRequestMethod)requestMethod { 
  4.     return YTKRequestMethodPOST; 
  5. - (instancetype)requestArgument { 
  6.     return parameter; 

serverRespData是基類自定義的一個(gè)參數(shù),是數(shù)據(jù)過濾之后的response。

  1.  _serverRespData = [self.responseJSONObject objectForKey:@"data"]; 
  2. - (QDZQUseModel *)user { // 重寫user的get方法。 
  3.     _user = [QDZQUserEntity yy_modelWithDictionary:[self.serverRespData objectForKey:@"appUser"]]; 
  4.     return _user; 

3.3 如何調(diào)用這個(gè)API

  1. + (void)fetchUserInfoSuccess:(void (^)(void))success failure:(void (^)(NSError * error))failure { 
  2.     UserInfoApi *api = [[UserInfoApi alloc] init]; 
  3.     [api startWithCompletionBlockWithSuccess:^(__kindof YTKBaseRequest * _Nonnull request) { 
  4.         if (success) { } 
  5.     } failure:^(__kindof YTKBaseRequest * _Nonnull request) { 
  6.         if (failure) { } 
  7.     }]; 

3.4 添加請(qǐng)求頭

如果你需要添加請(qǐng)求頭的話,你可以實(shí)現(xiàn)下面這個(gè)方法。

  1. - (nullable NSDictionary<nsstring *, nsstring *> *)requestHeaderFieldValueDictionary { 
  2.     return @{@"token" : @""}; 
  3. }</nsstring *, nsstring *> 

以上,是兩種網(wǎng)絡(luò)請(qǐng)求方式(離散式、集約式)。

責(zé)任編輯:未麗燕 來源: 簡(jiǎn)書
相關(guān)推薦

2017-04-21 16:00:09

2021-05-06 16:21:55

鴻蒙HarmonyOS應(yīng)用開發(fā)

2011-08-18 11:10:49

Core Plot框架IOS開發(fā)

2013-03-28 14:11:10

iOS異步GET方法請(qǐng)

2009-12-22 16:10:21

ADO.NET框架

2012-03-01 20:32:29

iOS

2024-11-04 08:16:08

Go語言Web 框架

2017-03-23 14:18:30

LinuxShell命令

2022-10-13 19:14:17

Python網(wǎng)絡(luò)資源

2012-05-21 21:34:51

iOS

2015-07-13 16:56:40

IOS 9適配教程

2010-05-10 14:55:35

網(wǎng)絡(luò)負(fù)載均衡

2021-11-09 09:43:52

鴻蒙HarmonyOS應(yīng)用

2021-01-08 09:07:19

Scrapy框架爬蟲

2011-08-03 14:33:54

IOS4.2 HTTP 請(qǐng)求

2021-03-02 16:25:52

微服務(wù)架構(gòu)技術(shù)

2016-03-18 09:36:13

ios基礎(chǔ)框架

2015-06-02 09:51:40

iOS網(wǎng)絡(luò)請(qǐng)求封裝接口

2022-02-16 09:01:13

iOSS開發(fā)XCode

2012-06-01 11:10:07

iOS基本框架圖示
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)