YTKNetwork使用心得----基本介绍

开篇语:

从14年上班第一天就开始用AFNetworking这个超级好用的网络请求库,到现在AFNetworking已经大大小小更新了三个版本,对它的情感之深,无人能及。

这么多年一直都是自己在封装AFNetworking,虽然足以满足项目需求,但是毕竟公司需求有限,深入挖掘的动力也不大。后来iOS大V唐巧风生水起,猿题库也进入公众视野。两年前猿题库技术团队开源了基于AFNetworking封装的iOS网络请求库YTKNetwork,成功的引起了我的注意。

基本介绍:

简单点说YTKNetwork就是在AFNetworking的基础上封装了一层,已提供一些更高级的功能:

  • 支持按时间缓存网络请求内容
  • 支持按版本号缓存网络请求内容
  • 支持统一设置服务器和 CDN 的地址
  • 支持检查返回 JSON 内容的合法性
  • 支持文件的断点续传
  • 支持 block 和 delegate 两种模式的回调方式
  • 支持批量的网络请求发送,并统一设置它们的回调(实现在 YTKBatchRequest 类中)
  • 支持方便地设置有相互依赖的网络请求的发送,例如:发送请求 A,根据请求 A 的结果,选择性的发送请求 B 和 C,再根据 B 和 C 的结果,选择性的发送请求 D。(实现在 YTKChainRequest 类中)
  • 支持网络请求 URL 的 filter,可以统一为网络请求加上一些参数,或者修改一些路径。
  • 定义了一套插件机制,可以很方便地为 YTKNetwork 增加功能。猿题库官方现在提供了一个插件,可以在某些网络请求发起时,在界面上显示“正在加载”的 HUD。

其中,缓存网络请求对大多数开发者来说可能并不重要,毕竟我们还是希望在页面刷新的时候获取到最新的内容。CDN的配置我相信大多数小公司都是用不到的,如果你的业务真的需要CDN来支撑,那已经不是小公司啦!我更推荐你去研究微信开源的网络框架Mars。

YTKNetwork跟别的网络框架(包括我自己封装的),最特别的地方就是可以管理互相依赖的网络请求,即YTKBatchRequest (可以方便的设置若干请求的统一回调)和YTKChainRequest(可以设置若干请求的前后依赖关系)。当然,好的接口设计应该避免出现让客户端同时请求这么多数据。

简单介绍一下这两个类:

1、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 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");
    }];
}

2、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
}

这两个类在实际使用中用的还是比较多的,例如登录功能,写接口的人可能更加关注功能的单一性,所以,如果你想在登录之后紧接着获取用户的个人信息,这时候用YTKBatchRequest就比较方便了。

有没有发现定义很多接口类非常麻烦?每个请求都写一边init方法很累?下一篇我将介绍,如何让它用的更顺手。

 

 

 

你可能感兴趣的:(iOS)