AFNetworking 解析

官网:http://cocoadocs.org/docsets/AFNetworking/3.1.0/

http://www.jianshu.com/p/856f0e26279d

简单认识:

- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method

                                       URLString:(NSString *)URLString

                                      parameters:(id)parameters

                                  uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgress

                                downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgress

                                         success:(void (^)(NSURLSessionDataTask *, id))success

                                         failure:(void (^)(NSURLSessionDataTask *, NSError *))failure

{

    NSError *serializationError = nil;

    // 创建可变请求

    // baseURL处理 传参进来的URLString

    // [NSURL URLWithString:URLString relativeToURL:self.baseURL]这个的理解:可以参照本类的 .h文件中对baseURL的讲解

    // 用这个生成URL的方法时注意:In macOS 10.7 and later or iOS 5 and later, this method returns nil if the URL string is nil. In earlier versions, this method throws an exception if the URL string is nil.

    NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];

    

    if (serializationError) {

        if (failure) {

#pragma clang diagnostic push

#pragma clang diagnostic ignored "-Wgnu"

            dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{

                failure(nil, serializationError);

            });

#pragma clang diagnostic pop

        }


        return nil;

    }


    __block NSURLSessionDataTask *dataTask = nil;

    dataTask = [self dataTaskWithRequest:request

                          uploadProgress:uploadProgress

                        downloadProgress:downloadProgress

                       completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {

        if (error) {

            if (failure) {

                failure(dataTask, error);

            }

        } else {

            if (success) {

                success(dataTask, responseObject);

            }

        }

    }];


    return dataTask;

}



类:AFURLRequestSerialization

#pragma mark -


FOUNDATION_EXPORT NSArray * AFQueryStringPairsFromDictionary(NSDictionary *dictionary);

FOUNDATION_EXPORT NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value);


NSString * AFQueryStringFromParameters(NSDictionary *parameters) {

    NSMutableArray *mutablePairs = [NSMutableArray array];

    for (AFQueryStringPair *pair in AFQueryStringPairsFromDictionary(parameters)) {

        [mutablePairs addObject:[pair URLEncodedStringValue]];

    }


    return [mutablePairs componentsJoinedByString:@"&"];

}


NSArray * AFQueryStringPairsFromDictionary(NSDictionary *dictionary) {

    return AFQueryStringPairsFromKeyAndValue(nil, dictionary);

}


NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value) {

    NSMutableArray *mutableQueryStringComponents = [NSMutableArray array];


    // 创建一个比较器

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(compare:)];

    // 如果是字典的话

    if ([value isKindOfClass:[NSDictionary class]]) {

        

        NSDictionary *dictionary = value;

        // Sort dictionary keys to ensure consistent ordering in query string, which is important when deserializing potentially ambiguous sequences, such as an array of dictionaries

        for (id nestedKey in [dictionary.allKeys sortedArrayUsingDescriptors:@[ sortDescriptor ]]) {

            

            // 遍历排好序的  key

            id nestedValue = dictionary[nestedKey];

            if (nestedValue) {

                // AFQueryStringPairsFromKeyAndValue注意这个 C 的方法 递归

                // 判断一下 当前函数的第一参数 key 存在吗;存在就用key拼接的字符串,否则就用nestedKey

                [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)];

            }

        }

    }

    // 如果是数组的话

    else if ([value isKindOfClass:[NSArray class]]) {

        NSArray *array = value;

        for (id nestedValue in array) {

            [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)];

        }

    }

    // 如果是set的话

    else if ([value isKindOfClass:[NSSet class]]) {

        NSSet *set = value;

        for (id obj in [set sortedArrayUsingDescriptors:@[ sortDescriptor ]]) {

            [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue(key, obj)];

        }

    }

    // 如果不是以上三种集合

    else {

        [mutableQueryStringComponents addObject:[[AFQueryStringPair alloc] initWithField:key value:value]];

    }


    return mutableQueryStringComponents;

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值