这里我们看一下这个类NSURLSessionDataTask /* * An NSURLSessionDataTask does not provide any additional * functionality NSURLSessionDataTask的实例化 下面我们接着看进一步的调用 - (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method 实例化NSURLSessionDataTask对象,并调用下面方法返回该对象。 request; 这个其实就是调用到苹果系统的方法里面了,根据request创建对应的任务NSURLSessionDataTask。 (b) 为指定的任务添加代理 下面我们就看一下为指定的任务NSURLSessionDataTask是如何添加代理的。
* _Nonnull, id _Nullable))success failure:(void (^)(NSURLSessionDataTask * _Nullable * _Nonnull, id _Nullable))success failure:(void (^)(NSURLSessionDataTask * _Nullable , NSError * _Nonnull))failure { NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@" *, id))success failure:(void (^)(NSURLSessionDataTask *, NSError 源码 - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
<AFNetworking/AFNetworking.h> @interface JJHTTPSessionManager : AFHTTPSessionManager - (nullable NSURLSessionDataTask * _Nullable task, NSError * _Nullable error))failure; - (nullable NSURLSessionDataTask *)JJPost:(NSString Nullable uploadProgress))uploadProgress success:(nullable void (^)(NSURLSessionDataTask , id _Nullable responseObject))success failure:(nullable void (^)(NSURLSessionDataTask , id _Nullable responseObject))success failure:(nullable void (^)(NSURLSessionDataTask
*task))success failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task , NSError *error))failure; //获取一个POST请求 - (nullable NSURLSessionDataTask *)POST:(NSString *)URLString * _Nullable task, NSError *error))failure; //获取一个PATCH请求 - (nullable NSURLSessionDataTask *)PATCH:( * _Nullable task, NSError *error))failure; //获取一个DELETE请求 - (nullable NSURLSessionDataTask *)DELETE *task))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))
NSProgress * _Nonnull downloadProgress) { NSLog(@"下载 = %@",downloadProgress); } success:^(NSURLSessionDataTask defaultCenter] postNotificationName:@"center" object:nil userInfo:responseObject]; } failure:^(NSURLSessionDataTask ^(NSProgress * _Nonnull uploadProgress) { NSLog(@"上传 = %@",uploadProgress); } success:^(NSURLSessionDataTask Nonnull task, id _Nullable responseObject) { NSLog(@"响应 = %@",responseObject); } failure:^(NSURLSessionDataTask ^(NSProgress * _Nonnull uploadProgress) { NSLog(@"上传 = %@",uploadProgress); } success:^(NSURLSessionDataTask
* _Nonnull task, id _Nullable responseObject) { // 请求成功 } failure:^(NSURLSessionDataTask * _Nullable , NSError *error))failure; // 发起post请求 - (nullable NSURLSessionDataTask *)POST:(NSString *)URLString * _Nullable task, NSError *error))failure; // 发起delete请求 - (nullable NSURLSessionDataTask *)DELETE: * _Nullable task, NSError *error))failure; @end 它的实现最后都会汇集到下面两个方法中,一个上传,一个下载 - (NSURLSessionDataTask // - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request; // - (NSURLSessionDataTask
*task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure 代码示例 // GET *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task ))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task,
*task, id _Nullable responseObject))success failure:(nullable void (^)(NSURLSessionDataTask error:(NSError *__autoreleasing *)error 2、NSMutableURLRequest对象,作为一个参数重写父类AFURLSessionManager的方法生成一个NSURLSessionDataTask . */ @interface NSURLSessionUploadTask : NSURLSessionDataTask @end /* * NSURLSessionDownloadTask is 对象时采用了url_session_manager_create_task_safely的方式,查看代码 是因为之前iOS的一个bug,在并发队列中生成NSURLSessionDataTask对象会有问题 AFN给每个dataTask都绑定了一个代理,主要处理例如下载进度,下载完成后的一些格式处理 - (void)addDelegateForDataTask:(NSURLSessionDataTask *
*dataTask, id responseObject) = ^(NSURLSessionDataTask *dataTask,id responseObject) { responseBlock (responseObject, nil); }; // 定义失败的block void (^failure)(NSURLSessionDataTask *dataTask,NSError *error) = ^(NSURLSessionDataTask *dataTask,NSError *error) { responseBlock(nil, error); (responseObject, nil); }; void (^failure)(NSURLSessionDataTask *dataTask,NSError *error) = ^( NSURLSessionDataTask *dataTask,NSError *error) { responseBlock(nil, error); }; [[
. - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse which cannot be converted to download tasks). */ - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask ---- 2. - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didBecomeDownloadTask ---- 3. - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData ---- 4. - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask willCacheResponse
Paste_Image.png 调用post请求 - (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters progress:(void (^)(NSProgress * _Nonnull))uploadProgress success:(void (^)(NSURLSessionDataTask * _Nonnull, id _Nullable))success failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull ))failure 新建一个task - (NSURLSessionDataTask *)dataTaskWithHTTPMethod:(NSString *)method URLString:(NSString *, id))success failure:(void (^)(NSURLSessionDataTask *, NSError *))failure 新建一个request - (NSMutableURLRequest
*task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task , NSError * _Nonnull))failure { NSURLSessionDataTask *dataTask = [self dataTaskWithHTTPMethod:@" *, id))success failure:(void (^)(NSURLSessionDataTask *, NSError The request may have a body stream. */ - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *) resume] 其中,【注解1】、【注解2】、【注解3】这三个方法得到的是同一个对象,即【注解3】中系统原生的NSURLSessionDataTask对象。
* _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE; - (nullable NSURLSessionDataTask *) , NSError *error))failure; //进行POST请求 - (nullable NSURLSessionDataTask *)POST:(NSString *)URLString * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE; - (nullable NSURLSessionDataTask *) * _Nullable task, NSError *error))failure DEPRECATED_ATTRIBUTE; - (nullable NSURLSessionDataTask *) * _Nullable task, NSError *error))failure; //进行DELETE请求 - (nullable NSURLSessionDataTask *)DELETE:(
progress:^(NSProgress * _Nonnull downloadProgress) { } success:^(NSURLSessionDataTask responseObject) { callback(true,responseObject,nil); } failure:^(NSURLSessionDataTask progress:^(NSProgress * _Nonnull downloadProgress) { } success:^(NSURLSessionDataTask responseObject) { callback(true,responseObject,nil); } failure:^(NSURLSessionDataTask
manager GET:URL parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"这里打印请求成功要做的事"); } failure:^(NSURLSessionDataTask manager POST:URL parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { } failure:^(NSURLSessionDataTask * _Nullable task WKNSLog(@"%lf",1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount); } success:^(NSURLSessionDataTask
secrequest setHTTPBody:secbody]; NSURLSession *requestSessions = [NSURLSession sharedSession]; NSURLSessionDataTask 以POST请求为例,调用的 - (nullable NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(nullable id) *task, id _Nullable responseObject))success failure:(nullable void (^)(NSURLSessionDataTask * _Nullable *error))failure方法 进入该方法查看实现,发现除了常用的POST和GET请求之外,还有PUT、HEAD、DELETE、PATCH这些其它请求类型的方法实现,都执行了同一个方法 - (NSURLSessionDataTask *, id))success failure:(void (^)(NSURLSessionDataTask *, NSError *))failure 在该方法中,首先调用AFHTTPRequestSerializer
这里使用了NSURLSessionDataTask,以便实现『离线断点下载』。 @property (nonatomic, strong) NSFileHandle *fileHandle; /** 下载任务 */ @property (nonatomic, strong) NSURLSessionDataTask initWithSessionConfiguration:configuration]; } return _manager; } /** * downloadTask的懒加载 */ - (NSURLSessionDataTask setDataTaskDidReceiveResponseBlock:^NSURLSessionResponseDisposition(NSURLSession * _Nonnull session, NSURLSessionDataTask ]; [self.manager setDataTaskDidReceiveDataBlock:^(NSURLSession * _Nonnull session, NSURLSessionDataTask
AFHTTPSessionManager manager];31[manager GET:urlString_132parameters:dictionary33progress:nil34success:^(NSURLSessionDataTask 成功请求数据1:%@",[responseObjectclass]);36//如果请求成功,发送信号量37dispatch_semaphore_signal(semaphore);38} failure:^(NSURLSessionDataTask Nonnull task,id_Nullable responseObject) {33NSLog(@"成功请求数据1:%@",[responseObjectclass]);34} failure:^(NSURLSessionDataTask Nonnull task,id_Nullable responseObject) {46NSLog(@"成功请求数据2:%@",[responseObjectclass]);47} failure:^(NSURLSessionDataTask {33NSLog(@"%@",[NSThread currentThread]);34NSLog(@"成功请求数据1:%@",[responseObjectclass]);35} failure:^(NSURLSessionDataTask
成功或失败) param data 返回的数据(响应体) param response 响应头 param error 错误信息 */ NSURLSessionDataTask NSUTF8StringEncoding]; //创建会话对象 NSURLSession *session = [NSURLSession sharedSession]; //创建请求 Task NSURLSessionDataTask NSUTF8StringEncoding]); }]; //发送请求 [dataTask resume]; NSURLSessionDataTask resume]; 遵守协议,实现代理方法(常用的有三种代理方法) -(void)URLSession:(NSURLSession *)session dataTask:(nonnull NSURLSessionDataTask completionHandler(NSURLSessionResponseAllow); } -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask
它们之间的关系如下图: NSURLSessionTask及三个子类继承关系: NSURLSessionDataTask:主要用于读取服务端的简单数据,比如JSON数据。 (1)NSURLSessionDataTask 通过request对象或url创建: -(NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest 指定回调的代码块: -(NSURLSessionDataTask*)dataTaskWithRequest:(NSURLRequest*)requestcompletionHandler:(void(^ 1.1.3启动任务 //启动任务 [taskresume]; 1.2GET请求与POST请求 我们可以使用NSURLSessionDataTask进行GET请求与POST请求。 username=myName&pwd=myPsd"]; NSURLSessionDataTask*task=[sessiondataTaskWithURL:urlcompletionHandler:^