ytk礦機app
⑴ ios ytk怎麼按版本號緩存
YTKUrlFilterProtocol
介面
YTKUrlFilterProtocol 介面用於實現對網路請求URL或參數的重寫,例如可以統一為網路請求加上一些參數,或者修改一些路徑。
例如:在猿題庫中,我們需要為每個網路請求加上客戶端的版本號作為參數。所以我們實現了如下一個YTKUrlArgumentsFilter 類,實現了 YTKUrlFilterProtocol 介面:
// YTKUrlArgumentsFilter.h
@interface YTKUrlArgumentsFilter : NSObject <YTKUrlFilterProtocol>
+ (YTKUrlArgumentsFilter *)filterWithArguments:(NSDictionary *)arguments;
- (NSString *)filterUrl:(NSString *)originUrl withRequest:(YTKBaseRequest *)request;
@end
// YTKUrlArgumentsFilter.m
@implementation YTKUrlArgumentsFilter {
NSDictionary *_arguments;
}
+ (YTKUrlArgumentsFilter *)filterWithArguments:(NSDictionary *)arguments {
return [[self alloc] initWithArguments:arguments];
}
- (id)initWithArguments:(NSDictionary *)arguments {
self = [super init];
if (self) {
_arguments = arguments;
}
return self;
}
- (NSString *)filterUrl:(NSString *)originUrl withRequest:(YTKBaseRequest *)request {
return [YTKNetworkPrivate urlStringWithOriginUrlString:originUrl appendParameters:_arguments];
}
@end
通過以上YTKUrlArgumentsFilter 類,我們就可以用以下代碼方便地為網路請求增加統一的參數,如增加當前客戶端的版本號:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self setupRequestFilters];
return YES;
}
- (void)setupRequestFilters {
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
YTKNetworkConfig *config = [YTKNetworkConfig sharedInstance];
YTKUrlArgumentsFilter *urlFilter = [YTKUrlArgumentsFilter filterWithArguments:@{@"version": appVersion}];
[config addUrlFilter:urlFilter];
}
YTKBatchRequest
類
YTKBatchRequest 類:用於方便地發送批量的網路請求,YTKBatchRequest是一個容器類,它可以放置多個 YTKRequest子類,並統一處理這多個網路請求的成功和失敗。
在如下的示例中,我們發送了4個批量的請求,並統一處理這4個請求同時成功的回調。
#import "YTKBatchRequest.h"
#import "GetImageApi.h"
#import "GetUserInfoApi.h"
- (void)sendBatchRequest {
GetImageApi *a = [[GetImageApi alloc] initWithImageId:@"1.jpg"];
GetImageApi *b = [[GetImageApi alloc] initWithImageId:@"2.jpg"];
GetImageApi *c = [[GetImageApi alloc] initWithImageId:@"3.jpg"];
GetUserInfoApi *d = [[GetUserInfoApi alloc] initWithUserId:@"123"];
YTKBatchRequest *batchRequest = [[YTKBatchRequest alloc] initWithRequestArray:@[a, b, c, d]];
[batchRequest :^(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");
}];
}
YTKChainRequest
類
用於管理有相互依賴的網路請求,它實際上最終可以用來管理多個拓撲排序後的網路請求。
例如,我們有一個需求,需要用戶在注冊時,先發送注冊的Api,然後:
如果注冊成功,再發送讀取用戶信息的Api。並且,讀取用戶信息的Api需要使用注冊成功返回的用戶id號。
如果注冊失敗,則不發送讀取用戶信息的Api了。
以下是具體的代碼示例,在示例中,我們在sendChainRequest方法中設置好了Api相互的依賴,然後。 我們就可以通過chainRequestFinished回調來處理所有網路請求都發送成功的邏輯了。如果有任何其中一個網路請求失敗了,則會觸發chainRequestFailed回調。
- (void)sendChainRequest {
RegisterApi *reg = [[RegisterApi alloc] initWithUsername:@"username" password:@"password"];
YTKChainRequest *chainReq = [[YTKChainRequest alloc] init];
[chainReq addRequest:reg callback:^(YTKChainRequest *chainRequest, YTKBaseRequest *baseRequest) {
RegisterApi *result = (RegisterApi *)baseRequest;
NSString *userId = [result userId];
GetUserInfoApi *api = [[GetUserInfoApi alloc] initWithUserId:userId];
[chainRequest addRequest:api callback:nil];
}];
chainReq.delegate = self;
// start to send request
[chainReq start];
}
- (void)chainRequestFinished:(YTKChainRequest *)chainRequest {
// all requests are done
}
- (void)chainRequestFailed:(YTKChainRequest *)chainRequest failedBaseRequest:(YTKBaseRequest*)request {
// some one of request is failed
}
顯示上次緩存的內容
在實際開發中,有一些內容可能會載入很慢,我們想先顯示上次的內容,等載入成功後,再用最新的內容替換上次的內容。也有時候,由於網路處於斷開狀態,為了更加友好,我們想顯示上次緩存中的內容。這個時候,可以使用 YTKReqeust 的直接載入緩存的高級用法。
具體的方法是直接使用YTKRequest的-
(id)cacheJson方法,即可獲得上次緩存的內容。當然,你需要把- (NSInteger)cacheTimeInSeconds覆蓋,返回一個大於等於0的值,這樣才能開啟YTKRequest的緩存功能,否則默認情況下,緩存功能是關閉的。
以下是一個示例,我們在載入用戶信息前,先取得上次載入的內容,然後再發送請求,請求成功後再更新界面:
- (void)loadCacheData {
NSString *userId = @"1";
GetUserInfoApi *api = [[GetUserInfoApi alloc] initWithUserId:userId];
if ([api cacheJson]) {
NSDictionary *json = [api cacheJson];
NSLog(@"json = %@", json);
// show cached data
}
[api :^(YTKBaseRequest *request) {
NSLog(@"update ui");
} failure:^(YTKBaseRequest *request) {
NSLog(@"failed");
}];
}
上傳文件
我們可以通過覆蓋constructingBodyBlock方法,來方便地上傳圖片等附件,如下是一個示例:
// YTKRequest.h
#import "YTKRequest.h"
@interface UploadImageApi : YTKRequest
- (id)initWithImage:(UIImage *)image;
- (NSString *)responseImageId;
@end
// YTKRequest.m
@implementation UploadImageApi {
UIImage *_image;
}
- (id)initWithImage:(UIImage *)image {
self = [super init];
if (self) {
_image = image;
}
return self;
}
- (YTKRequestMethod)requestMethod {
return YTKRequestMethodPost;
}
- (NSString *)requestUrl {
return @"/iphone/image/upload";
}
- (AFConstructingBlock)constructingBodyBlock {
return ^(id<AFMultipartFormData> formData) {
NSData *data = UIImageJPEGRepresentation(_image, 0.9);
NSString *name = @"image";
NSString *formKey = @"image";
NSString *type = @"image/jpeg";
[formData appendPartWithFileData:data name:formKey fileName:name mimeType:type];
};
}
- (id)jsonValidator {
return @{ @"imageId": [NSString class] };
}
- (NSString *)responseImageId {
NSDictionary *dict = self.responseJSONObject;
return dict[@"imageId"];
}
@end
通過如上代碼,我們創建了一個上傳圖片,然後獲得伺服器返回的 imageId 的網路請求Api。
定製網路請求的HeaderField
通過覆蓋方法返回一個dictionary對象來自定義請求的HeaderField,返回的dictionary,其key即為HeaderField的key,value為HeaderField的Value,需要注意的是key和value都必須為string對象。
定製 buildCustomUrlRequest
通過覆蓋buildCustomUrlRequest方法,返回一個NSUrlRequest對象來達到完全自定義請求的需求。該方法定義在YTKBaseRequest類,如下:
// 構建自定義的UrlRequest,
// 若這個方法返回非nil對象,會忽略requestUrl, requestArgument, requestMethod, requestSerializerType,
- (NSURLRequest *)buildCustomUrlRequest;
如注釋所言,如果構建自定義的request,會忽略其他的一切自定義request的方法,例如requestUrl, requestArgument,requestMethod, requestSerializerType,。一個上傳gzippingData的示例如下:
- (NSURLRequest *)buildCustomUrlRequest {
NSData *rawData = [[_events jsonString] dataUsingEncoding:NSUTF8StringEncoding];
NSData *gzippingData = [NSData gtm_dataByGzippingData:rawData];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.requestUrl]];
[request setHTTPMethod:@"POST"];
[request addValue:@"application/json;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
[request addValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];
[request setHTTPBody:gzippingData];
return request;
}