标签:
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部分,你可以通过接收这个通知来做操作
标签:
原文地址:http://www.cnblogs.com/zangwucao/p/5486744.html