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. WebGIS前端瓦片地图显示原理及实现

    目前,有很多WebGIS开发包,ArcGIS API for JS.OpenLayers.LeafLetjs等为我们从事WebGIS开发的人封装了很多强大的功能.我们很方便的使用这些库的时候,也让我们 ...

  2. Selenium Web 自动化 - 项目持续集成

    Selenium Web 自动化 - 项目持续集成 2017-02-13 目录 1环境准备  1.1 安装git  1.2 安装jenkins  1.3 安装jenkins插件  1.4 jekins ...

  3. Java的JDBC原生态学习以及连接池的用法

    JDBC是什么 JDBC(Java Data Base Connectivity)是Java访问数据库的桥梁,但它只是接口规范,具体实现是各数据库厂商提供的驱动程序(Driver). 应用程序.JDB ...

  4. Visual Studio 20周年软件趋势随想

    从2002年开始,.net让开发人员能快速构建和部署应用程序,便捷的开发windows和web服务器应用,同时著名的hacker Miguel de Icaza ,Miguel 为了GNOME项目启动 ...

  5. iOS 调试心得

    修复 bug 占用我们日常开发的大部分时间,熟练的使用调试工具可以给我们节约大部分的时间. LLDB 的常用命令 expression expresion 是一个非常常用的命令,我们可以通过这个命令来 ...

  6. HTML 5入门知识——Drag

    HTML 5拖放 拖放的步骤: 1.对象元素的draggable属性设置为true,还需要注意的是a元素和img元素必须指定href. 2.编写与拖放有关的事件处理代码: DataTransfer对象 ...

  7. Ionic2 开发笔记(1)ionic2 +angular2搭建

    1.去node.js官网下载对应版本https://nodejs.org/en/(不会请看OnsenUi搭载,里面有详细过程) 2.然后通过npm下载Ionic和cordova $ npm insta ...

  8. vue.js 踩坑第一步 利用vue-cli vue-router搭建一个带有底部导航栏移动前端项目

    vue.js学习 踩坑第一步 1.首先安装vue-cli脚手架 不多赘述,主要参考WiseWrong 的 Vue 爬坑之路(一)-- 使用 vue-cli 搭建项目 2.项目呈现效果 项目呈现网址:w ...

  9. java对象克隆以及深拷贝和浅拷贝

    1.什么是"克隆"? 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不 ...

  10. RxJava 笔记

    前言 目前 RxJava 是安卓开发圈内最流行的库之一,本来准备研究研究,但看了扔物线写的<给 Android 开发者的 RxJava 详解>后,觉得生无可恋,哦不,是觉得已经写无可写. ...