开源库学习 | AFNetWorking (一)使用

分析AFNetWorking(版本3.1.0)的源码,因为涉及篇幅较长,这里分开叙述。

这里主要介绍的是AFNetworking的各种用法,希望通过这边文章,你可以知道AFNetWorking的用法及开源库内的层次结构.

写在开头

AFNetWorking 2.0版本之后就加入使用NSURLSession,因为iOS 9.0 之后将会废弃NSURLConnection,
如果你对NSURLSession和NSURLSession不熟悉的话,可以点击这里查看我之前总结的文章。

AFNetWorking 2.6之后,需要Xcode 7, 并且抛弃iOS 6和 OX 10.8的支持,也是为了更好地支持watchOS 2

AFNetWorking 3.0抛弃 NSURLConnection的支持,开始支持tvOS 9.0

基本用法

这里先说一下AFNetWorking的常规用法,说之前,先简单回顾一下NSURLSession的用法,作为对比。

1
2
3
4
5
6
7
8
9
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:@"url"]];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//Warning : 需要在这里进行解析。
NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//通过回调Block或者KVO方法将数据传出
}];
[task resume];

请求

AFURLSessionManager 用法与NSURLSession一致
AFHTTPSessionManager的Get、POST、HEAD、PUT等用法类似,以Get为例

1
2
3
4
5
6
7
8
9
10
//Step 1
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[[NSURL alloc] initWithString:@”url”]];
//Step 2
[manager GET:@”relative_url” parameters:nil progress:nil
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@" ,responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@", error);
}];

序列化

1
2
3
4
NSString *URLString = @"http://example.com";
NSDictionary *parameters = @{@"foo": @"bar", @"baz": @[@1, @2, @3]};
[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:URLString parameters:parameters error:nil];
NSLog(@"%@", request.URL); //output : http://example.com?baz%5B%5D=1&baz%5B%5D=2&baz%5B%5D=3&foo=bar

AFNetWorking概述

目录结构

NSURLSession

  • AFURLSessionManager 核心NSURLSession管理类,实际进行Task的操作。遵从 < NSURLSessionTaskDelegate>,< NSURLSessionDataDelegate>,< NSURLSessionDownloadDelegate>和< NSURLSessionDelegate>协议。
  • AFHTTPSessionManager 继承AFURLSessionManager,主要是方便HTTP的请求

Serialization

  • < AFURLRequestSerialization> 负责请求请求序列化

    • AFHTTPRequestSerializer
    • AFJSONRequestSerializer
    • AFPropertyListRequestSerializer
  • < AFURLResponseSerialization> 负责相应序列化

    • AFHTTPResponseSerializer
    • AFJSONResponseSerializer
    • AFXMLParserResponseSerializer
    • AFXMLDocumentResponseSerializer (Mac OS X)
    • AFPropertyListResponseSerializer
    • AFImageResponseSerializer
    • AFCompoundResponseSerializer
  • Additional Functionality

    • AFSecurityPolicy 负责安全认证

    • AFNetworkReachabilityManager 负责监控网络状态的

调用关系

以实际发送一个HTTP的get请求,看如何进行各模块之间的调用

upload successful

一些思考

  • 如何取消已经发送的网络请求
  • 如何设置请求的依赖关系
  • AFSessionManager对NSURLSession进行封装,主要优势是什么?