AFN3.0源码解析

本文详细解析了AFN3.0的post请求过程,从用户创建单例开始,逐步分析了post方法的调用、请求结果的回调以及AFN如何处理循环引用问题。重点介绍了AFHTTPSessionManager在初始化、请求发送和结果回调中的作用。
摘要由CSDN通过智能技术生成

目录结构

在这里插入图片描述

  1. NSURLSession
    这个目录是封装了http请求需要的代码,其中AFURLSessionManager类主要处理http请求,AFHTTPSessionManager类是对其进行封装留给用户调用的上层接口。比如我们平时的get,post请求就要用到该类,也是本文要分析的重点。

  2. Reachability
    这个目录是判断网络状态的

  3. Security
    https请求

  4. Serialization
    http请求和相应的配置

  5. UIKit
    分类

post请求过程

第一步:用户创建单例

+ (instancetype)shareManager{
    static dispatch_once_t token;
    static HttpClientManager *instance = nil;
    _dispatch_once(&token, ^{
        instance = [[self alloc] init];
        [instance initSession];
    });
    return instance;
}

- (void)initSession{
    _sessionManger = [AFHTTPSessionManager manager];
    _sessionManger.requestSerializer = [AFJSONRequestSerializer serializer];//请求配置
    AFJSONResponseSerializer *response = [AFJSONResponseSerializer serializer];//相应配置
    response.removesKeysWithNullValues = YES;//当出现null值时候移除该键值对
    _sessionManger.responseSerializer =  response;
    _sessionManger.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json", @"text/plain", @"text/html", nil];//相应配置

    _baseUrl = @"http:xxxxx/";//协议+域名+端口号(请求前缀)

}

[AFHTTPSessionManager manager]查看源代码发现接下来调用一下代码

//1.(AFHTTPSessionManager类)
+ (instancetype)manager {
    return [[[self class] alloc] initWithBaseURL:nil];
}

//2.(AFHTTPSessionManager类)
- (instancetype)initWithBaseURL:(NSURL *)url {
    return [self initWithBaseURL:url sessionConfiguration:nil];
}

//3.(AFHTTPSessionManager类)
- (instancetype)initWithBaseURL:(NSURL *)url
           sessionConfiguration:(NSURLSessionConfiguration *)configuration
{
    self = [super initWithSessionConfiguration:configuration];//分析父类
    if (!self) {
        return nil;
    }

    // Ensure terminal slash for baseURL path, so that NSURL +URLWithString:relativeToURL: works as expected
    if ([[url path] length] > 0 && ![[url absoluteString] hasSuffix:@"/"]) {
        url = [url URLByAppendingPathComponent:@""];
    }

    self.baseURL = url;

    self.requestSerializer = [AFHTTPRequestSerializer serializer];
    self.responseSerializer = [AFJSONResponseSerializer serializer];

    return self;
}

//4.(AFURLSessionManager类)
- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration {
    self = [super init];
    if (!self) {
        return nil;
    }

    if (!configuration) {
        configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    }

    self.sessionConfiguration = configuration;

    self.operationQueue = [[NSOperationQueue alloc] init];
    self.operationQueue.maxConcurrentOperationCount = 1;

    self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];//注意delegate = self,也就是说网络请求的结果在AFURLSession
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值