AFNetworking 是一个适用于IOS 和 Mac OSX 两个平台的网络库,他是在Foundation URL Loading System  基础上进行的一套封装 ,并提供了丰富的API接口给用户使用

第一个是用来做网络请求的,第二个则是和UI 使用相关的

AFURLSessionManager和AFHttpSessionManager是里面两个比较重要的类

1.AFURLSessionManager  主要提供了数据的请求,上传和下载功能

属性方面:

@property(readonly,nonatomic,strong)NSArray*task;

@property(readonly,nonatomic,strong)NSArray*datsTasks;

@property(readonly,nonatomic,strong)NSArray*uploadTask;

@property(readonly,nonatomic,strong)NSArray*downloadTask;

这四个属性 分别可以拿到总的任务集合  数据任务集合 上传任务集合  下载任务集合

@property(nonatomic,assign)Bool attemptsToRcreateUploadTasksForBackgroundSessions;

IOS7中存在一个Bug,在创建后台上传任务时候,有时会返回nil,为了解决这个问题,AFNetworking遵照了苹果的建议,在创建失败的时候,会重新尝试创建,次数默认为3次,所以你的应用如果有场景会在后台上传的情况话 应将值设为YES 避免上传失败。

API方面 -(void)invalidateSessionCancelingTasks:(Bool)cancelPendingTasks;

如果将cancelPedingTasks设为YES的话 会在主线程关闭掉当前的会话,NO的话会等到当前Tasks 结束后在关闭

-(NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject,  NSError * _Nullable error))completionHandler;

-(NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request uploadProgress:(nullable void (^)(NSProgress *uploadProgress))uploadProgressBlock downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgressBlock completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject,  NSError * _Nullable error))completionHandler;

数据请求里,request是发出的http请求,uploadProgress 和 downloadProgress  是在上传和下载进度有更新的情况下才会调用, completionHandler 则是请求结束后返回的内容。

-(NSURLSessionUploadTask*)uploadTaskWithRequest:(NSURLRequest*)request fromFile:(NSURL*)fileURL progress:(nullable void(^)(NSProgress*uploadProgress)) uploadProgressBlock completionHandler:(nullable void(^ (NSURLResponse*response,id_Nullable responseObject,NSError*_Nullable error))completionHandler;

-(NSURLSessionUploadTask*)uploadTaskWithRequest:(NSURLRequest*)request fromData:(nullableNSData*)bodyData progress:(nullable void(^)(NSProgress*uploadProgress))uploadProgressBlock completionHandler:(nullable void(^)(NSURLResponse*response,id_Nullable responseObject,NSError*_Nullable error))completionHandler;

-(NSURLSessionUploadTask*)uploadTaskWithStreamedRequest:(NSURLRequest*)request progress:(nullable void(^)(NSProgress*uploadProgress)) uploadProgressBlock completionHandler:(nullable void(^)(NSURLResponse*response,id_Nullable responseObject,NSError*_Nullable error))completionHandler;                                                           上面是三种不同的数据上传方法,第一种通过fileURL (需要上传的本地文件URL路径),  第二种是bodyData(需要上传的http body体的数据),第三种是流请求的方法,使用该方法的时候,一定设置setTaskNeedNewBodyStreamBlock回调,否则session没办法在从新发送steam的时候找到数据源

-(NSURLSessionDownloadTask*)downloadTaskWithRequest:(NSURLRequest*)request progress:(nullable void(^)(NSProgress*downloadProgress)) downloadProgressBlock destination:(nullable NSURL* (^ (NSURL*targetPath,NSURLResponse*response))destination completionHandler:(nullable void(^)(NSURLResponse*response,NSURL*_Nullable filePath,NSError*_Nullable error))completionHandler;

-(NSURLSessionDownloadTask*)downloadTaskWithResumeData:(NSData*)resumeData progress:(nullable void(^)(NSProgress*downloadProgress)) downloadProgressBlock destination:(nullable NSURL* (^)(NSURL*targetPath,NSURLResponse*response))destination completionHandler:(nullable void(^)(NSURLResponse*response,NSURL*_Nullable filePath,NSError*_Nullable error))completionHandler;

下载方式分为两种, 第一种是通过http请求方式下载 另一种是通过之前的下载数据来 恢复下载,destination在下载的过程中文件会先存放在一个临时位置,等下载完成后,会转移到目标位置。

FOUNDATION_EXPORT NSString*constAFNetworkingTaskDidResumeNotification;

在对外提供的notification key 里面,使用了FOUNDATION_EXPORT来定义常量,使用FOUNDATION_EXPORT 和extern或者define 有什么区别呢?

在C文件编译下 相同  在C++ 编译下和extern"C"相同,32位机的环境下又是另外的编译情况,兼容性方面,FOUNDATION_EXPORT 比较好。

效率方面FOUNDATION_EXPORT 的string常量可以通过== 进行指针比较 而extern或者define 需要isEqualTostring进行比较,前者效率比较高。

进入到实现文件里面,一些常量的定义和初始化,我就不展开分析了

- (void)URLSession:(__unused NSURLSession*)session task:(NSURLSessionTask*)task didCompleteWithError:(NSError*)error

在NSURLSessionTaskDelegate的这个方法里面,我们首先看到了

#pragma clang diagnostic push

#pragma clang diagnostic ignored "-Wgnu"

// some codes

#pragma clang diagnostic pop

这个的作用是用来消除特定区域的clang的编译警告,-Wgnu则是消除?:警告

这个是clang的警告message列表http://fuckingclangwarnings.com

在这个代理里面,将请求获得数据,进行组装通过completionHandler回调给外面,并会发出task 完成的通知,这个在UIKit+AFNetworking里UIRefreshControl +AFNetworking里会接收到,用来停止刷新,如果你不使用AF的UI部分,你可以通过接收这个通知来做操作

AFNetworking 内部详解的更多相关文章

  1. AFNetworking使用详解

    导语: 众所周知,AFNetworking是目前IOS开发中非常受欢迎的第三方网络通信类库,同时AFNetworking对苹果官方NSURLConnection和NSURLSession进行了封装,使 ...

  2. AFNetworking 用法详解

    之前一直使用ASIHttpRequest 做网络请求 ,后来新公司用AFNetWorking ,经过一段时间学习总结一下二者的优缺点: 1.AFNetWorking的优缺点 优点: 1.维护和使用者比 ...

  3. AFNetworking 与 UIKit+AFNetworking 详解

    资料来源 : http://github.ibireme.com/github/list/ios GitHub : 链接地址 简介 : A delightful iOS and OS X networ ...

  4. 大数据Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  5. [转]Redis内部数据结构详解-sds

    本文是<Redis内部数据结构详解>系列的第二篇,讲述Redis中使用最多的一个基础数据结构:sds. 不管在哪门编程语言当中,字符串都几乎是使用最多的数据结构.sds正是在Redis中被 ...

  6. Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解

    转自:http://blog.csdn.net/iamdll/article/details/20998035 分类: 分布式 2014-03-11 10:31 156人阅读 评论(0) 收藏 举报 ...

  7. Android进阶笔记:AIDL内部实现详解 (一)

    AIDL内部实现详解 (一) AIDL的作用是实现跨进程通讯使用方法也非常的简单,他的设计模式是典型的C/S架构.使用AIDL只要在Client端和Server端的项目根目录下面创建一个aidl的文件 ...

  8. http500:服务器内部错误案例详解(服务器代码语法错误或者逻辑错误)

    http500:服务器内部错误案例详解(服务器代码语法错误或者逻辑错误) 一.总结 服务器内部错误可能是服务器中代码运行的时候的语法错误或者逻辑错误 二.http500:服务器内部错误案例详解 只是一 ...

  9. 探索Redis设计与实现6:Redis内部数据结构详解——skiplist

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

随机推荐

  1. 最近新版本的pangolin出现了点问题,我把可用的旧版本上传到了github

    经测试该版本编译没有问题. 下载地址:https://github.com/zzx2GH/Pangolin.git

  2. Cocos2d-x shader学习1: 灰度shader

    灰度shader 最近在学习shader,就把cocos2d-x 3.x版本中的很简单也很常用的灰度shader拿出来学习一下. #ifdef GL_ES precision mediump floa ...

  3. 在.NET项目中使用PostSharp,使用MemoryCache实现缓存的处理(转)

    在之前一篇随笔<在.NET项目中使用PostSharp,实现AOP面向切面编程处理>介绍了PostSharp框架的使用,试用PostSharp能给我带来很多便利和优势,减少代码冗余,提高可 ...

  4. 2292: 【POJ Challenge 】永远挑战

    2292: [POJ Challenge ]永远挑战 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 553  Solved: 230[Submit][ ...

  5. 1711: [Usaco2007 Open]Dingin吃饭

    1711: [Usaco2007 Open]Dingin吃饭 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 560  Solved: 290[Submit ...

  6. 算法模板——sap网络最大流 2(非递归+邻接表)

    实现功能:同最大流 1 这里面主要是把前面的邻接矩阵改成了邻接表,相比之下速度大大提高——本人实测,当M=1000000 N=10000 时,暂且不考虑邻接矩阵会不会MLE,新的程序速度快了很多倍(我 ...

  7. OpenvSwitch Port Mirror in OpenStack Neutron

    前言 最近使用搭建了一个基于VXLAN的OpenStack 环境,发现要去dump ovs interfaces的包其实还是蛮麻烦的, 经过多番努力,找到了如下的在openstack下网络环境的一些t ...

  8. html中submit和button的区别(总结) [ 转自欣步同学 ]

    html中submit和button的区别(总结) submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了. 如果表单在点击提交按钮后需要用JS进行处理(包括输入验证 ...

  9. HashSet和TreeSet 的区别与分析

    Set是java中一个不包含重复元素的collection.更正式地说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素.正如其名称所暗示的, ...

  10. Asp.net web api 知多少

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...