深入剖析AFNetworking:源代码揭秘与详解

更新:11-15 名人轶事 我要投稿 纠错 投诉

今天给各位分享深入剖析AFNetworking:源代码揭秘与详解的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

1.AFURLSessionManager;

2.AFHTTPSessionManager;

3. AFURLRequestSerialization;

4.AFURLResponse序列化;

AFURLSessionManager是AFN的核心文件,集成了管理请求创建、管理、销毁、安全、请求重定向、请求重启等功能。主要实现了NSURLSession和NSURLSessionTask的封装,以及重定向处理结果。

AFHTTPSessionManager 是AFURLSessionManager 的子类。它主要用于处理HTTP和HTTPS请求。这个类是我们平时用得最多的。我们对这个类进行二次封装,然后完成我们请求接口的业务。

AFURLRequestSerialization 类只是创建一个NSURLRequest 请求正文。 AFN直接把这部分独立出来,把所有与请求相关的业务都放在这里,比如设置GETPOST方法、设置请求头、超时时间、请求的缓存策略以及如何处理请求参数(GET和POST的方法分别是不同)清晰明了!

AFURLResponseSerialization 显然这个类是用来处理网络请求的返回值的。返回数据的序列化、编解码、数据处理等。这里AFURLResponseSerialization 只是一个协议。 AFHTTPResponseSerializer 类遵守此协议并实现协议方法。还有其他几个类继承了AFHTTPResponseSerializer,比如:AFJSONResponseSerializer、AFXMLParserResponseSerializer、AFPropertyListResponseSerializer、AFImageResponseSerializer,所以在处理数据的时候,看看你的返回值是什么。只需使用该类来处理它的任何类型。 AFN 使用AFJSONResponseSerializer。

话不多说,代码如下:

1、AFHTTPSessionManager中,常用的请求方法有两种,POSTGET方法

- (NSURLSessionDataTask *)POST:(NSString *)URLString

参数:(id)参数

Progress:(void (^)(NSProgress * _Nonnull))uploadProgress

success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))成功

failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))失败

{

NSURLSessionDataTask *dataTask=[self dataTaskWithHTTPMethod:@"POST" URLString:URLString 参数:参数uploadProgress:uploadProgress downloadProgress:nil success:success failure:failure];

[数据任务恢复];

返回数据任务;

}

- (NSURLSessionDataTask *)GET:(NSString *)URLString

参数:(id)参数

Progress:(void (^)(NSProgress * _Nonnull))downloadProgress

success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))成功

failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull))失败

{

NSURLSessionDataTask *dataTask=[self dataTaskWithHTTPMethod:@"GET"

URLString:URLString

参数:参数

上传进度:nil

下载进度:下载进度

成功:成功

失败:失败];

[数据任务恢复];

返回数据任务;

}

//两个方法都调用了dataTaskWithHTTPMethod:这个方法返回一个任务,就是我们的请求任务。 //我们也可以在获取这个任务后取消请求。我们来看看dataTaskWithHTTPMethod:这个方法。

- (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)方法

URLString:(NSString *)URLString

参数:(id)参数

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

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

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

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

{

NSError *serializationError=nil;

//这里使用requestSerialize来获取request请求体。如果是帖子,则在body中设置参数。如果是get,则在url末尾添加键值对。使用baseURL时,可以去看SDK的介绍。介绍的很清楚。

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

如果(序列化错误){

如果(失败){

#pragma clang 诊断推送

#pragma clang 诊断忽略了“-Wgnu”

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

失败(零,序列化错误);

});

#pragma clang 诊断流行

}

返回零;

}

//这里创建一个下载任务,跳转到AFURLSessionManager执行该方法。 Block是成功和失败的回调。注意,成功参数为task、responseObject,失败参数为task、error;

__block NSURLSessionDataTask *dataTask=nil;

dataTask=[self dataTaskWithRequest:request

上传进度:上传进度

下载进度:下载进度

completionHandler:^(NSURLResponse * __unused 响应,id responseObject,NSError *错误) {

如果(错误){

如果(失败){

失败(数据任务,错误);

}

} 别的{

如果(成功){

成功(数据任务,响应对象);

}

}

}];

返回数据任务;

}

接下来去AFURLSessionManger看看如何生成任务。

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)请求

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

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

completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError * _Nullable 错误))completionHandler {

__block NSURLSessionDataTask *dataTask=nil;

//显然,这里是生成任务的,self.session就是NSURLSession,是在创建AFURLSessionManger时创建的。这里的session默认是defaultSessionConfiguration格式。 AFURLSessionManger会实现session代理方法,但这里不做处理。这些方法返回的数据被重定向到其他地方进行处理。有关处理位置的详细信息,请参阅下文。

url_session_manager_create_task_safely(^{

dataTask=[self.session dataTaskWithRequest:request];

});

//这里是定义用来处理重定向数据的代理

[self addDelegateForDataTask:dataTask uploadProgress:uploadProgressBlock downloadProgress:downloadProgressBlock finishHandler:completionHandler];

返回数据任务;

}

//生成代理对象,注意:只有一个会话,但是生成了多个任务。代理方法返回的数据可以根据task.taskIdentifier来区分是哪个task返回的数据。之所以使用session,是因为http的底层实际上是通过TCP/IP来完成的。然而,http是一个问答。回答完毕后,链接结束。但建立和断开链路需要三次握手和四次握手。挥挥手,每次建立链接都会消耗一定的内存。但使用NSURLSession后,TCP链接可以复用。这也是iOS9之后NSURLConnection被废弃的原因之一。

- (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 *delegate=[[AFURLSessionManagerTaskDelegate alloc] init];

delegate.manager=self;

delegate.completionHandler=completionHandler;

dataTask.taskDescription=self.taskDescriptionForSessionTasks;

[自我设置Delegate:delegate forTask:dataTask];

delegate.uploadProgressBlock=uploadProgressBlock;

delegate.downloadProgressBlock=downloadProgressBlock;

}

- (void)addDelegateForUploadTask:(NSURLSessionUploadTask *)uploadTask

Progress:(void (^)(NSProgress *uploadProgress)) uploadProgressBlock

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

{

AFURLSessionManagerTaskDelegate *delegate=[[AFURLSessionManagerTaskDelegate alloc] init];

delegate.manager=self;

delegate.completionHandler=completionHandler;

uploadTask.taskDescription=self.taskDescriptionForSessionTasks;

[self setDelegate:delegate forTask:uploadTask];

delegate.uploadProgressBlock=uploadProgressBlock;

}

OK,关于深入剖析AFNetworking:源代码揭秘与详解和的内容到此结束了,希望对大家有所帮助。

用户评论

←极§速

终于有时间开始看这个了!

    有9位网友表示赞同!

一生只盼一人

AFNetworking 是网络请求的利器啊,想深入了解下底层机制。

    有13位网友表示赞同!

娇眉恨

感觉这篇源码解读刚好可以帮助我理解AFN的使用原理。

    有20位网友表示赞同!

孤自凉丶

最近在做项目用到AFN,想要看看它的实现细节。

    有9位网友表示赞同!

゛指尖的阳光丶

对iOS开发比较感兴趣,希望能通过源码解读更深刻地把握AFN.

    有6位网友表示赞同!

剑已封鞘

之前用AFN也遇到过一些问题 ,希望这篇解读能解决我的困惑。

    有10位网友表示赞同!

别悲哀

想学习一下网络请求的知识,AFNetworking是个很好的切入点

    有14位网友表示赞同!

请在乎我1秒

对代码分析比较感兴趣,希望能从中学习到一些编程技巧。

    有8位网友表示赞同!

愁杀

看看AFN是怎么处理异步请求的。

    有7位网友表示赞同!

权诈

学习源码解析是一个好习惯,能加深对技术的理解

    有16位网友表示赞同!

陌離

看解读的同时也应该结合实际练习,这样才能更好地掌握AFN的使用方法。

    有17位网友表示赞同!

开心的笨小孩

希望能看到详细的代码注释和讲解,更容易理解作者的思路

    有8位网友表示赞同!

淡抹丶悲伤

AFNetworking 真的很强大!源码解析能让我也成为高手

    有18位网友表示赞同!

伤离别

学习别人的优秀代码总是很受益,希望这篇解读能给我很多启发

    有17位网友表示赞同!

拽年很骚

现在开发中AFN还是比较常用的框架,深入了解它很有必要。

    有10位网友表示赞同!

回忆未来

感觉看完源码解析后我对AFNetworking的应用信心会更足

    有16位网友表示赞同!

若他只爱我。

可以分享一下你学习到哪些知识和技巧吗?

    有11位网友表示赞同!

冷青裳

想请教一下关于AFN的一些问题,希望能得到解答。

    有10位网友表示赞同!

有一种中毒叫上瘾成咆哮i

这篇文章对你对AFNetworking的理解有什么帮助?

    有16位网友表示赞同!

【深入剖析AFNetworking:源代码揭秘与详解】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:探索欢乐颂五美魅力之旅:思维导图揭秘 下一篇:四川凉山西昌建昌古城大通门城墙:历史见证下的生命顽强奇迹