AFNetworking 内部详解

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部分,你可以通过接收这个通知来做操作

时间: 2024-08-01 03:44:08

AFNetworking 内部详解的相关文章

AFNetworking 使用详解

AFNetworking是一个轻量级的iOS网络通信类库.它建立在NSURLConnection和NSOperation等类库的基础上.它支持HTTP请求和基于REST的网络服务(包括GET.POST. PUT.DELETE等).支持ARC. Github地址:https://github.com/AFNetworking/AFNetworking 转载自:http://blog.csdn.net/codywangziham01/article/details/38088017 //  MJVi

javascript原型详解

1.原型基本特征: ps:1.原型类型与其他语言的一个类,所定义的属性,方法可以被此类产生的所有对象所共享 2.修改原型的属性或者方法,会立即生效,其派生的子类的属性,方法也将改变 例子1: function Mytest(){ } Mytest.prototype.name="jerry"; var test1=new Mytest(); alert(test1.name);//jerry Mytest.prototype.name="jack"; var tes

ARM内部大家族详解---嵌入式回归第四篇

学习ARM,首先要对ARM有个大体宏观的了解!这样后边学起来也会更轻松一些! 常用熟悉的一般分为: 1. 芯片:6410    210    2440   (这三款都是三星的) 2. ARM核:arm11    A8    arm9 3. 指令架构:armv7   armv6 首先ARM大家族的一些名词: 上面的图简化一下就是ARM内部之间的一些区分: 下面简单的看一下S3C2440芯片的架构图: 从上面芯片架构图中可以看出有一部分是ARM9TDMI (processor core)芯片的核,这

硬盘内部硬件结构和工作原理详解[zz]

一般硬盘正面贴有产品标签,主要包括厂家信息和产品信息,如商标.型号.序列号.生产日期.容量.参数和主从设置方法等.这些信息是正确使用硬盘的基本依据,下面将逐步介绍它们的含义. 硬盘主要由盘体.控制电路板和接口部件等组成,如图1-1所示.盘体是一个密封的腔体.硬盘的内部结构通常是指盘体的内部结构:控制电路板上主要有硬盘BIOS.硬盘缓存(即CACHE)和主控制芯片等单元,如图1-2所示:硬盘接口包括电源插座.数据接口和主.从跳线,如图1-3所示. 图1-1 硬盘的外观 图1-2 控制电路板 图1-

AxureRP7.0基础教程系列 部件详解 Inline Frame 内部框架

原型库网站-讲师金乌原创发布,可自由转载,请注明出处! Axure中文官网:www.AxureRP.cn   <AxureRP7.0部件详解> Inline Frame 内部框架 使用内部框架,可以嵌入视频,地图,和HTML到您的原型设计中.使用案例 模拟移动体验 使用手机外壳部件,并在手机外壳的内容区域添加内部框架,内部框架可以签入其他页面或站外链接并显示在手机外壳的屏幕上.这样可以在你的电脑上实现模拟移动设备的体验. 签入外部内容 外部的HTML文件.视频.地图等内容都可以签入到内部框架中

AFNetworking 3.0 使用详解 和 源码解析实现原理

AFN原理&& AFN如何使用RunLoop来实现的: NSString * requestURL = @"http://119.254.98.136/api/v1/web/homepage"; // AFHTTPSessionManager * manager =[[AFHTTPSessionManager alloc] init]; AFHTTPSessionManager * manager =[AFHTTPSessionManager manager]; [ma

iOS疯狂详解之AFNetworking图片缓存问题

AFNetworking网络库已经提供了很好的图片缓存机制,效率是比较高的,但是我发现没有直接提供清除缓存的功能,可项目通常都需要添加 清除功能的功能,因此,在这里我以UIImageView+AFNetworking类中添加了下面一个清除功能方法: + (void)clearCache; + (void)clearCache { AFImageCache *cache = (AFImageCache *)[UIImageView sharedImageCache]; [cache removeA

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

本文是<Redis内部数据结构详解>系列的第二篇,讲述Redis中使用最多的一个基础数据结构:sds. 不管在哪门编程语言当中,字符串都几乎是使用最多的数据结构.sds正是在Redis中被广泛使用的字符串结构,它的全称是Simple Dynamic String.与其它语言环境中出现的字符串相比,它具有如下显著的特点: 可动态扩展内存.sds表示的字符串其内容可以修改,也可以追加.在很多语言中字符串会分为mutable和immutable两种,显然sds属于mutable类型的. 二进制安全(

【转】Redis内部数据结构详解——ziplist

本文是<Redis内部数据结构详解>系列的第四篇.在本文中,我们首先介绍一个新的Redis内部数据结构--ziplist,然后在文章后半部分我们会讨论一下在robj, dict和ziplist的基础上,Redis对外暴露的hash结构是怎样构建起来的. 我们在讨论中还会涉及到两个Redis配置(在redis.conf中的ADVANCED CONFIG部分): hash-max-ziplist-entries 512 hash-max-ziplist-value 64 本文的后半部分会对这两个配