iOS開發--YTKNetwork高級功能

昨天說了一下YTKNetwork的基礎功能的使用,今天說一下對于高級功能的使用,具體如下:

1)YTKUrlFilterProtocol接口

YTKUrlFilterProtocol接口用于實現對網絡請求URL或參數的重寫,可以統一為網絡請求加上一些參數,或者修改一些路徑。

例如:當需要為每個網絡請求加上客戶端的版本號作為參數。如下一個YTKUrlArgumentsFilter類,實現YTKUrlFilterProtocol接口:

// YTKUrlArgumentsFilter.h

//實現自己的URL拼接工具類

@interfaceYTKUrlArgumentsFilter:NSObject

+ (YTKUrlArgumentsFilter *)filterWithArguments:(NSDictionary*)arguments;

- (NSString*)filterUrl:(NSString*)originUrlwithRequest:(YTKBaseRequest *)request;

@end

// YTKUrlArgumentsFilter.m

@implementationYTKUrlArgumentsFilter{

NSDictionary*_arguments;

}

+ (YTKUrlArgumentsFilter *)filterWithArguments:(NSDictionary*)arguments {

return[[selfalloc]initWithArguments:arguments];

}

- (id)initWithArguments:(NSDictionary*)arguments {

self = [superinit];

if(self) {

_arguments = arguments;

}

returnself;

}

- (NSString*)filterUrl:(NSString*)originUrlwithRequest:(YTKBaseRequest *)request {

return[YTKUrlArgumentsFilterurlStringWithOriginUrlString:originUrlappendParameters:_arguments];

}

@end

通過以上YTKUrlArgumentsFilter類,就可以用以下代碼方便地為網絡請求增加統一的參數,如增加當前客戶端的版本號:

- (BOOL)application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {

[selfsetupRequestFilters];

returnYES;

}

- (void)setupRequestFilters {

NSString*appVersion = [[[NSBundlemainBundle]infoDictionary]objectForKey:@"CFBundleShortVersionString"];

YTKNetworkConfig *config = [YTKNetworkConfigsharedConfig];

YTKUrlArgumentsFilter *urlFilter = [YTKUrlArgumentsFilterfilterWithArguments:@{@"version": appVersion}];

[configaddUrlFilter:urlFilter];

}

2)YTKBatchRequest

YTKBatchRequest類:用于方便地發送批量的網絡請求,YTKBatchRequest是一個容器類,它可以放置多個YTKRequest子類,并統一處理這多個網絡請求的成功和失敗。

#import"YTKBatchRequest.h"

#import"GetImageApi.h"

#import"GetUserInfoApi.h"

- (void)sendBatchRequest {

GetImageApi *a = [[GetImageApialloc]initWithImageId:@"1.jpg"];

GetImageApi *b = [[GetImageApialloc]initWithImageId:@"2.jpg"];

GetImageApi *c = [[GetImageApialloc]initWithImageId:@"3.jpg"];

GetUserInfoApi *d = [[GetUserInfoApialloc]initWithUserId:@"123"];

YTKBatchRequest *batchRequest = [[YTKBatchRequestalloc]initWithRequestArray:@[a, b, c, d]];

[batchRequeststartWithCompletionBlockWithSuccess:^(YTKBatchRequest *batchRequest) {

NSLog(@"succeed");

NSArray*requests = batchRequest.requestArray;

GetImageApi *a = (GetImageApi *)requests[0];

GetImageApi *b = (GetImageApi *)requests[1];

GetImageApi *c = (GetImageApi *)requests[2];

GetUserInfoApi *user = (GetUserInfoApi *)requests[3];

// deal with requests result ...

}failure:^(YTKBatchRequest *batchRequest) {

NSLog(@"failed");

}];

}

3)YTKChainRequest

用于管理有相互依賴的網絡請求。

例如,用戶在注冊時,先發送注冊的Api,如果注冊成功,再發送讀取用戶信息的Api。并且讀取用戶信息的Api需要使用注冊成功返回的用戶id號。如果注冊失敗,則不發送讀取用戶信息的Api。

以下是具體的代碼示例,在示例中,我們在sendChainRequest方法中設置好了Api相互的依賴,然后就可以通過chainRequestFinished回調來處理所有網絡請求都發送成功的邏輯。如果有任何其中一個網絡請求失敗,則會觸發chainRequestFailed回調。

- (void)sendChainRequest {

RegisterApi *reg = [[RegisterApialloc]initWithUsername:@"username"password:@"password"];

YTKChainRequest *chainReq = [[YTKChainRequestalloc]init];

[chainReqaddRequest:regcallback:^(YTKChainRequest *chainRequest, YTKBaseRequest *baseRequest) {

RegisterApi *result = (RegisterApi *)baseRequest;

NSString*userId = [resultuserId];

GetUserInfoApi *api = [[GetUserInfoApialloc]initWithUserId:userId];

[chainRequestaddRequest:apicallback:nil];

}];

chainReq.delegate = self;

// start to send request

[chainReqstart];

}

- (void)chainRequestFinished:(YTKChainRequest *)chainRequest {

// all requests are done

}

- (void)chainRequestFailed:(YTKChainRequest *)chainRequest failedBaseRequest:(YTKBaseRequest*)request {

// some one of request is failed

}

4)顯示上次緩存的內容

在實際開發中,有一些內容可能會加載很慢,我們想先顯示上次的內容,等加載成功后,再用最新的內容替換上次的內容。有時候由于網絡處于斷開狀態,我們想顯示上次緩存中的內容。這時可以使用YTKReqeust的直接加載緩存的高級用法。

具體的方法是直接使用YTKRequest的- (BOOL)loadCacheWithError:方法即可獲得上次緩存的內容。當然,你需要把- (NSInteger)cacheTimeInSeconds覆蓋,返回一個大于等于0的值,這樣才能開啟YTKRequest的緩存功能,否則默認情況下,緩存功能是關閉的。

以下是一個示例,我們在加載用戶信息前,先取得上次加載的內容,然后再發送請求,請求成功后再更新界面:

- (void)loadCacheData {

NSString*userId =@"1";

GetUserInfoApi *api = [[GetUserInfoApialloc]initWithUserId:userId];

if([apiloadCacheWithError:nil]) {

NSDictionary*json = [apiresponseJSONObject];

NSLog(@"json =%@", json);

// show cached data

}

[apistartWithCompletionBlockWithSuccess:^(YTKBaseRequest *request) {

NSLog(@"update ui");

}failure:^(YTKBaseRequest *request) {

NSLog(@"failed");

}];

}

5)上傳文件

我們可以通過覆蓋constructingBodyBlock方法,來方便地上傳圖片等附件,如下是一個示例:

// YTKRequest.h

#import"YTKRequest.h"

@interfaceUploadImageApi:YTKRequest

- (id)initWithImage:(UIImage *)image;

- (NSString*)responseImageId;

@end

// YTKRequest.m

@implementationUploadImageApi{

UIImage *_image;

}

- (id)initWithImage:(UIImage *)image {

self = [superinit];

if(self) {

_image = image;

}

returnself;

}

- (YTKRequestMethod)requestMethod{

returnYTKRequestMethodPOST;

}

- (NSString*)requestUrl{

return@"/iphone/image/upload";

}

- (AFConstructingBlock)constructingBodyBlock{

return^(id formData) {

NSData*data =UIImageJPEGRepresentation(_image,0.9);

NSString*name =@"image";

NSString*formKey =@"image";

NSString*type =@"image/jpeg";

[formDataappendPartWithFileData:dataname:formKeyfileName:namemimeType:type];

};

}

- (id)jsonValidator{

return@{@"imageId": [NSStringclass] };

}

- (NSString*)responseImageId{

NSDictionary*dict = self.responseJSONObject;

returndict[@"imageId"];

}

@end

通過如上代碼,我們創建了一個上傳圖片,然后獲得服務器返回的imageId的網絡請求Api。

6)定制網絡請求的HeaderField

通過覆蓋requestHeaderFieldValueDictionary方法返回一個dictionary對象來自定義請求的HeaderField,返回的dictionary,其key即為HeaderField的key,value為HeaderField的Value,需要注意的是key和value都必須為string對象。

7)定制buildCustomUrlRequest

通過覆蓋buildCustomUrlRequest方法,返回一個NSUrlRequest對象來達到完全自定義請求的需求。該方法定義在YTKBaseRequest類,如下:

//構建自定義的UrlRequest,

//若這個方法返回非nil對象,會忽略requestUrl, requestArgument, requestMethod, requestSerializerType,requestHeaderFieldValueDictionary

- (NSURLRequest*)buildCustomUrlRequest;

如注釋所言,如果構建自定義的request,會忽略其他的一切自定義request的方法,例如requestUrl,requestArgument,requestMethod,requestSerializerType,requestHeaderFieldValueDictionary等等。一個上傳gzippingData的示例如下:

- (NSURLRequest*)buildCustomUrlRequest {

NSData*rawData = [[_eventsjsonString]dataUsingEncoding:NSUTF8StringEncoding];

NSData*gzippingData = [NSDatagtm_dataByGzippingData:rawData];

NSMutableURLRequest*request = [NSMutableURLRequestrequestWithURL:[NSURLURLWithString:self.requestUrl]];

[requestsetHTTPMethod:@"POST"];

[requestaddValue:@"application/json;charset=UTF-8"forHTTPHeaderField:@"Content-Type"];

[requestaddValue:@"gzip"forHTTPHeaderField:@"Content-Encoding"];

[requestsetHTTPBody:gzippingData];

returnrequest;

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容