之后已经废弃了NSURLConnection,NSURLSession成为其替代者,其基本知识网上很多,主要可以从NSURLSessionDataTask 、NSURLSessionDownloadTask 和NSURLSessionUploadTask 最近在写案例时发现其中的NSURLSessionUploadTask还是有着不少的坑,在开发时有时候很难一次性成功。所以将研究的过程记录与分享一下。我会以一个完整的案例来讲解如何使用。 但是在使用NSURLSessionUploadTask进行上传时最麻烦的是上传数据的构造,其遵循严格的规范,如下图,不能随意书写,不能随意书写,不能随意书写~,重要的事情说三遍,否则坑得你生活不能自理。 mainQueue]]; //6、获取上传的数据 NSData *uploadData = [self getData]; //7、创建上传任务 上传的数据来自getData方法 NSURLSessionUploadTask
NSURLSessionUploadTask:和下载任务对应,这个task主要是用于对服务端发送文件类型的数据使用的。 通过request创建,在上传时指定文件源或数据源: -(NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)requestfromFile :(NSURL *)fileURL; -(NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)requestfromData:( NSData *)bodyData; -(NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request; 进行文件的上传,使用NSURLSessionUploadTask文件上传共有两种方法: 方法1: NSURLSessionUploadTask *task=[[NSURLSessionsharedSession
℃热度 使用现状 普通任务和上传 下载任务方式 请求方法的控制 断点续传的方式 配置信息 NSURLSessionDataTask NSURLSessionDownloadTask NSURLSessionUploadTask 而使用NSURLSessionUploadTask下载文件,会默认下载到沙盒中的tem文件中,不会出现内存暴涨的情况,但是在下载完成后会把tem中的临时文件删除,需要在初始化任务方法时,在completionHandler 从这些方法中得知,分别返回了NSURLSessionDataTask、NSURLSessionUploadTask、NSURLSessionDownloadTask,NSURLSessionStreamTask NSURLSessionUploadTask 在 NSURLSession 中,文件上传主要使用两种方式: - (NSURLSessionUploadTask *)uploadTaskWithRequest :(NSURLRequest *)request fromFile:(NSURL *)fileURL; - (NSURLSessionUploadTask *)uploadTaskWithRequest
提供了下面网络请求三种的API,返回三种不同的Task - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request; - (NSURLSessionUploadTask from download and upload tasks. */ @interface NSURLSessionDataTask : NSURLSessionTask @end /* * An NSURLSessionUploadTask sent referencing an NSURLSessionDataTask equally apply * to NSURLSessionUploadTasks. */ @interface NSURLSessionUploadTask
. */ - (void)setProgressWithUploadProgressOfTask:(NSURLSessionUploadTask *)task // 上传 @interface NSURLSessionUploadTask : NSURLSessionDataTask @interface NSURLSessionDataTask : NSURLSessionTask AFTaskCountOfBytesReceivedContext = &AFTaskCountOfBytesReceivedContext; - (void)setProgressWithUploadProgressOfTask:(NSURLSessionUploadTask
-------- /// @name Running Upload Tasks ///--------------------------- //根据指定request fileURL等参数构造一个NSURLSessionUploadTask 任务 - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request Nullable responseObject, NSError * _Nullable error))completionHandler; //根据指定request和data等参数构造一个上传任务 - (NSURLSessionUploadTask _Nullable responseObject, NSError * _Nullable error))completionHandler; //根据指定的request构造一个上传任务 - (NSURLSessionUploadTask 对象 - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL - (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request; 在创建upload task 对象的方法 /** Creates an`NSURLSessionUploadTask` with the specified request for a local file. 对象的方法 /** Creates an`NSURLSessionUploadTask` with the specified request for an HTTP body. 对象的方法 /** Creates an`NSURLSessionUploadTask` with the specified streaming request.
NSProgress *progress = nil; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; NSURLSessionUploadTask
NSURLRequest requestWithURL:URL]; NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"]; NSURLSessionUploadTask AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; NSURLSessionUploadTask
NSURLSessionDataTask *> *dataTasks; // 当前upload的任务集合 @property (readonly, nonatomic, strong) NSArray <NSURLSessionUploadTask * _Nullable error))completionHandler; /// 下面3个是UploadTask相关的方法,对应fileURL/data/request 这三种不同的数据源 - (NSURLSessionUploadTask NSURLResponse *response, id _Nullable responseObject, NSError * _Nullable error))completionHandler; - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL; // - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData; // - (NSURLSessionUploadTask
NSURLRequest requestWithURL:URL]; NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"]; NSURLSessionUploadTask AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; NSURLSessionUploadTask
- (void)getTasksWithCompletionHandler:(void (^)(NSArray<NSURLSessionDataTask *> *dataTasks, NSArray<NSURLSessionUploadTask The body of the request will be created from the file referenced by fileURL - (NSURLSessionUploadTask - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData - (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request; */ /* Creates
根据职能不同Task有三种 // (1)NSURLSessionUploadTask: 上传用的Task, 传完以后不会再下载返回结果 // (2)NSURLSessionDownloadTask
NSURLSession根据request和fileURL创建uploadTask (系统方法) // 5.2 为uploadTask添加taskDelegate (详情同 downloadTask 4.2) NSURLSessionUploadTask 运用AFURLSessionManager根据request, 创建streamed uploadTask // 详情(同upload 5) NSURLSessionUploadTask *uploadTask
NSURLSessionUploadTask上传文件 #import "ViewController.h" #define Kboundary @"----WebKitFormBoundary35cxmtFcIglrlsad NSURLSessionUploadTask *upLoadTask = [session uploadTaskWithRequest:request fromData:[self getBody] completionHandler NSURLSessionUploadTask代理方法上传方法 #import "ViewController.h" #define Kboundary @"----WebKitFormBoundary35cxmtFcIglrlsad
error:(NSError *__autoreleasing *)error 上传带有图片request的API - (NSURLSessionUploadTask return; } [self xm_processURLRequest:urlRequest byXMRequest:request]; NSURLSessionUploadTask
initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; NSProgress *progress = nil; NSURLSessionUploadTask
addDelegateForDataTask:task uploadProgress:nil downloadProgress:nil completionHandler:nil]; } for (NSURLSessionUploadTask
addDelegateForDataTask:task uploadProgress:nil downloadProgress:nil completionHandler:nil]; } for (NSURLSessionUploadTask
addDelegateForDataTask:task uploadProgress:nil downloadProgress:nil completionHandler:nil]; } for (NSURLSessionUploadTask //将上传任务绑定 - (void)setProgressWithUploadProgressOfTask:(NSURLSessionUploadTask *)task