YTKNetwork笔记
猿题库开源的一个网络库YTKNetwork,基于AFNetworking3.0
YTKBatchRequest
YTKBatchRequest 类:用于方便地发送批量的网络请求,YTKBatchRequest 是一个容器类,它可以放置多个 YTKRequest
子类,并统一处理这多个网络请求的成功和失败。
实现原理
记录请求个数,每个请求成功即+1,全部成功或某个失败即回调。
Example
在如下的示例中,我们发送了 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 startWithCompletionBlockWithSuccess:^(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 了。
实现原理
请求加入有序数组,请求成功后加装下一个请求。
Example
以下是具体的代码示例,在示例中,我们在 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
}