如果我们要自定义代理来接收数据(数据任务data_task)的话,我们必须要实现下面两个代理(NSURLSessionDataDelegate, NSURLSessionTaskDelegate)方法:
- URLSession:dataTask:didReceiveData: 该方法提供我们任务请求的数据,一次返回一块儿(不是一次性全部返回);
- URLSession:task:didCompleteWithError:告诉我们数据已经全部接收完成(失败或者成功),每一个下载任务都应该实现该代理方法;
如果我们的app需要在URLSession:dataTask:didReceiveData:
方法返回之后使用数据,那么我们应该自己负责去存储这些数据。
例如,Web浏览器需要在数据到达时渲染之前已经被接收的数据,为了达到这个目的:
🌈🌈🌈 获取数据的做法:
把任务对象和NSMutableData对象一一映射到一个字典中进行存储,然后对data对象使用appendData: 方法把新到达的数据添加进去。
其实AFNetworking也是这么做的,我摘录了一段AFNetworking中关于该知识的代码:
@property (nonatomic, strong) NSMutableData *mutableData;
- (void)URLSession:(__unused NSURLSession *)session
dataTask:(__unused NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data
{
[self.mutableData appendData:data];
}
现在来看一下官方文档中的例子,下面的例子展示了怎样创建和开始一个任务:
/// Objective-C
NSURL *url = [NSURL URLWithString:@"https://www.example.com"];
NSURLSessionDataTask *task = [default_session dataTaskWithURL:url];
[task resume];
/// Swift
if let url = URL(string:"https://www.example.com"){
let task = default_session.dataTask(with: url)
task.resume()
}