AFNetworking解析(一)

AFURLSessionManager 请求关键类
AFHTTPSessionManager 请求包装类
AFNetworkReachabilityManager 网络状态类
AFSecurityPolicy 加密类
AFURLRequestSerialization 序列化类
AFURLResponseSerialization 反序列化类

AFHTTPSessionManager

继承自AFURLSessionManager
添加了属性

@property (readonly, nonatomic, strong, nullable) NSURL *baseURL;
@property (nonatomic, strong) AFHTTPRequestSerializer <AFURLRequestSerialization> * requestSerializer;
@property (nonatomic, strong) AFHTTPResponseSerializer <AFURLResponseSerialization> * responseSerializer;
@property (nonatomic, strong) AFSecurityPolicy *securityPolicy;

//初始化方法都会调用此方法

  - (instancetype)initWithBaseURL:(NSURL *)url
           sessionConfiguration:(NSURLSessionConfiguration *)configuration
{
    //初始化AFHTTPSessionManager
    self = [super initWithSessionConfiguration:configuration];
    if (!self) {
        return nil;
    }
    //确保baseURL路径的终端斜线,以便NSURL + URLWithString:relativeToURL:按预期工作
    // 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;
  }

get请求

- (NSURLSessionDataTask *)GET:(NSString *)URLString
                   parameters:(id)parameters
                     progress:(void (^)(NSProgress * _Nonnull))downloadProgress
                      success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success
                      failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))failure
{
    //生成task Get方式 调用 AFURLSessionManager方法
    NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@"GET"
                                                        URLString:URLString
                                                       parameters:parameters
                                                   uploadProgress:nil
                                                 downloadProgress:downloadProgress
                                                          success:success
                                                          failure:failure];
    //开始请求
    [dataTask resume];
    return dataTask;
}

AFURLSessionManager类

参数

@property (readonly, nonatomic, strong) NSURLSession *session;//包装session
@property (readonly, nonatomic, strong) NSOperationQueue *operationQueue;//回调队列
@property (nonatomic, strong) id <AFURLResponseSerialization> responseSerializer;//反序列化对象
@property (nonatomic, strong) AFSecurityPolicy *securityPolicy;
@property (readwrite, nonatomic, strong) AFNetworkReachabilityManager *reachabilityManager;//网络状态
@property (readonly, nonatomic, strong) NSArray <NSURLSessionTask *> *tasks;//任务
@property (readonly, nonatomic, strong) NSArray <NSURLSessionDataTask *> *dataTasks;
@property (readonly, nonatomic, strong) NSArray <NSURLSessionUploadTask *> *uploadTasks;
@property (readonly, nonatomic, strong) NSArray <NSURLSessionDownloadTask *> *downloadTasks;
@property (nonatomic, strong, nullable) dispatch_queue_t completionQueue;//请求完成队列
@property (nonatomic, strong, nullable) dispatch_group_t completionGroup;//请求完成队列组
@property (nonatomic, assign) BOOL attemptsToRecreateUploadTasksForBackgroundSessions;
//初始调用返回“nil”时是否尝试重试创建后台会话的上传任务。 默认为“NO”。

初始化方法

- (instancetype)initWithSessionConfiguration:(NSURLSessionConfiguration *)configuration {
    self = [super init];
    if (!self) {
        return nil;
    }
    //没有传configuration就用默认defaultSessionConfiguration
    if (!configuration) {
        configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    }
    //把configuration赋给AFURLSessionManager
    self.sessionConfiguration = configuration;
    //代理回调的队列,并发数为1
    self.operationQueue = [[NSOperationQueue alloc] init];
    self.operationQueue.maxConcurrentOperationCount = 1;
    //NSURLSession的委托委托给AFURLSessionManager对象,做进一步处理
    self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];
    //转码
    self.responseSerializer = [AFJSONResponseSerializer serializer];
    //默认安全策略
    self.securityPolicy = [AFSecurityPolicy defaultPolicy];
\#if !TARGET_OS_WATCH
    //网络状况
    self.reachabilityManager = [AFNetworkReachabilityManager sharedManager];#endif
    //存放delegate的字典
    self.mutableTaskDelegatesKeyedByTaskIdentifier = [[NSMutableDictionary alloc] init];
    //保护存放delegate的字典
    self.lock = [[NSLock alloc] init];
    self.lock.name = AFURLSessionManagerLockName;
    //置空所有运行中的task 防止后台回来重新初始化session
    [self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
        for (NSURLSessionDataTask *task in dataTasks) {
            [self addDelegateForDataTask:task uploadProgress:nil downloadProgress:nil completionHandler:nil];
        }
        for (NSURLSessionUploadTask *uploadTask in uploadTasks) {
            [self addDelegateForUploadTask:uploadTask progress:nil completionHandler:nil];
        }
        for (NSURLSessionDownloadTask *downloadTask in downloadTasks) {
            [self addDelegateForDownloadTask:downloadTask progress:nil destination:nil completionHandler:nil];
        }
    }];
    return self;
}
  1. 初始化配置和代理回调队列,新建NSURLSession
  2. 初始化反序列化
  3. 默认安全策略,网络状态初始化
  4. mutableTaskDelegatesKeyedByTaskIdentifier字典存放task和对应delegate
  5. self.lock 用来给mutableTaskDelegatesKeyedByTaskIdentifier操作加锁
  6. 置空所有运行中的task 防止后台回来重新初始化session

task的委托相关操作
//取出task的委托

- (AFURLSessionManagerTaskDelegate *)delegateForTask:(NSURLSessionTask *)task {
    NSParameterAssert(task);
    //按照task.taskIdentifier从mutableTaskDelegatesKeyedByTaskIdentifier字典中取出委托
    AFURLSessionManagerTaskDelegate *delegate = nil;
    [self.lock lock];
    delegate = self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)];
    [self.lock unlock];
    return delegate;
}

//添加自定义委托AFURLSessionManagerTaskDelegate

- (void)addDelegateForDataTask:(NSURLSessionDataTask *)dataTask
                uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgressBlock
              downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgressBlock
             completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
{
    >>//生成AFURLSessionManagerTaskDelegate委托对象,初始化data,progress,给progress配置取消,暂停,恢复方法,用来操作task
    AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] initWithTask:dataTask];
    //弱引用
    delegate.manager = self;
    //回调
    delegate.completionHandler = completionHandler;
    //这个taskDescriptionForSessionTasks用来发送开始和挂起通知的时候会用到,就是用这个值来Post通知,来两者对应
    dataTask.taskDescription = self.taskDescriptionForSessionTasks;
    //保存delegate
    [self setDelegate:delegate forTask:dataTask];
    //上传进度赋值给TaskDelegate
    delegate.uploadProgressBlock = uploadProgressBlock;
    //下载进度赋值给TaskDelegate
    delegate.downloadProgressBlock = downloadProgressBlock;
}

AFURLSessionManagerTaskDelegate类

- (void)addDelegateForDataTask:(NSURLSessionDataTask *)dataTask
                uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgressBlock
              downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgressBlock
             completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler

方法中实例化,作为AFURLSessionManager的回调使用

//添加自定义委托AFURLSessionManagerTaskDelegate
- (void)addDelegateForDataTask:(NSURLSessionDataTask *)dataTask
                uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgressBlock
              downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgressBlock
             completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
{
    //生成AFURLSessionManagerTaskDelegate委托对象,初始化data,progress,给progress配置取消,暂停,恢复方法,用来操作task
    AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] initWithTask:dataTask];
    //弱引用
    delegate.manager = self;
    //回调
    delegate.completionHandler = completionHandler;
    //这个taskDescriptionForSessionTasks用来发送开始和挂起通知的时候会用到,就是用这个值来Post通知,来两者对应
    dataTask.taskDescription = self.taskDescriptionForSessionTasks;
    //保存delegate
    [self setDelegate:delegate forTask:dataTask];
    //上传进度赋值给TaskDelegate
    delegate.uploadProgressBlock = uploadProgressBlock;
    //下载进度赋值给TaskDelegate
    delegate.downloadProgressBlock = downloadProgressBlock;
}

其中

    [self setDelegate:delegate forTask:dataTask];

加锁操作可变字典mutableTaskDelegatesKeyedByTaskIdentifier,把task.taskIdentifier和delegate作为键值对存进去
实现代码

- (void)setDelegate:(AFURLSessionManagerTaskDelegate *)delegate
            forTask:(NSURLSessionTask *)task
{
    NSParameterAssert(task);
    NSParameterAssert(delegate);
    //锁,保护mutableTaskDelegatesKeyedByTaskIdentifier字典
    [self.lock lock];
    //可变字典,用来保存task的delegate,键为task生成时的taskIdentifier
   self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)] = delegate;
    //添加取消,恢复通知
    [self addNotificationObserverForTask:task];
    [self.lock unlock];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容