IOS猿题库开源项目YTKNetwork的原理剖析

源代码地址:https://github.com/XinRan5312/YTKNetwork/

YTKNetwork是一个基于AFNetworking的网络层封装,包括以下几个核心的类


    YTKBaseRequest
    YTKRequest
    YTKNetworkAgent
    YTKNetworkConfig

YTKNetwork的基本用法:基本用法,YTKNetwork 的基本的思想是把每一个网络请求封装成对象。所以使用 YTKNetwork,你的每一种请求都需要继承 YTKRequest类,通过覆盖父类的一些方法来构造指定的网络请求。

下面会分别讲解这几个类。
YTKNetworkAgent

网络请求的总代理类,是对AFNetworking的封装。此类是一个单例。

内部包含的三个成员变量:

    AFHTTPRequestOperationManager *_manager;
        AFHTTPRequestOperationManagerd的单例网路请求manager对象
    YTKNetworkConfig *_config;
        负责配置一个相关的设置
    NSMutableDictionary *_requestsRecord;
        请求队列

对外的接口有以下方法:

    -(void)addRequest:(YTKBaseRequest *)request;

// 这里详细分析一下addRequest的内部实现
- (void)addRequest:(YTKBaseRequest *)request {
    YTKRequestMethod method = [request requestMethod];
    NSString *url = [self buildRequestUrl:request];
    id param = request.requestArgument;
    AFConstructingBlock constructingBlock = [request constructingBodyBlock];

    // 设置返回对象的格式,YTKRequestSerializerTypeHTTP代表返回二进制格式,YTKRequestSerializerTypeJSON代表返回一个json的根对象(NSDictionary或者NSArray)
    if (request.requestSerializerType == YTKRequestSerializerTypeHTTP) {
        _manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    } else if (request.requestSerializerType == YTKRequestSerializerTypeJSON) {
        _manager.requestSerializer = [AFJSONRequestSerializer serializer];
    }

    _manager.requestSerializer.timeoutInterval = [request requestTimeoutInterval];

    // 如果请求需要授权证书,这里设置用户名和密码
    NSArray *authorizationHeaderFieldArray = [request requestAuthorizationHeaderFieldArray];
    if (authorizationHeaderFieldArray != nil) {
        [_manager.requestSerializer setAuthorizationHeaderFieldWithUsername:(NSString *)authorizationHeaderFieldArray.firstObject
                                                                   password:(NSString *)authorizationHeaderFieldArray.lastObject];
    }

    // 设置其他HTTP header
    NSDictionary *headerFieldValueDictionary = [request requestHeaderFieldValueDictionary];
    if (headerFieldValueDictionary != nil) {
        for (id httpHeaderField in headerFieldValueDictionary.allKeys) {
            id value = headerFieldValueDictionary[httpHeaderField];
            if ([httpHeaderField isKindOfClass:[NSString class]] && [value isKindOfClass:[NSString class]]) {
                [_manager.requestSerializer setValue:(NSString *)value forHTTPHeaderField:(NSString *)httpHeaderField];
            } else {
                YTKLog(@"Error, class of key/value in headerFieldValueDictionary should be NSString.");
            }
        }
    }

    // 如果创建了自定义的NSURLRequest对象,就使用自定的对象
    NSURLRequest *customUrlRequest= [request buildCustomUrlRequest];
    if (customUrlRequest) {
        // 创建 AFHTTPRequestOperation 对象
        AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:customUrlRequest];
        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *op, id responseObject) {
            // 处理结果
            [self handleRequestResult:op];
        } failure:^(AFHTTPRequestOperation *op, NSError *error) {
            [self handleRequestResult:op];
        }];
        request.requestOperation = operation;
        operation.responseSerializer = _manager.responseSerializer;
        // 添加到请求队列
        [_manager.operationQueue addOperation:operation];
    } else {
        // 没有自定义NSURLRequest,需要手动创建
        if (method == YTKRequestMethodGet) {
            // 如果需要断点续传下载文件
            if (request.resumableDownloadPath) {
                // 拼接参数到url
                NSString *filteredUrl = [YTKNetworkPrivate urlStringWithOriginUrlString:url appendParameters:param];
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值