说在前边
只是感觉NSURLSession的Task比较多,代理方法比较多,本文就是用来整理这两个的,重点不在于NSURLSession,只是顺带说一嘴他
NSURLSessioin的功能
1.通过URL将数据下载到内存
2.通过URL将数据下载到文件系统
3.将数据上传到指定URL
4.在后台完成上述功能
NSURLSession
的代理方法和NSURLConnection
有些类似,都是分为接收响应、接收数据、请求完成几个阶段.
除了支持任务的暂停和断点续传,NSURLSession
之于NSURLConnection
的最伟大的进步就是支持后台上传下载任务
一个简单的网络请求
//最简单的HTTP请求
NSURL *url = [NSURL URLWithString:@"http://www.jianshu.com/"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"打印返回的数据 = %@",response);
}];
[task resume];
根据职能不同Task有三种子类:
NSURLSessionUploadTask
:上传用的Task,传完以后不会再下载返回结果;
NSURLSessionDownloadTask
:下载用的Task;
NSURLSessionDataTask
:可以上传内容,上传完成后再进行下载。可以进行上传和下载的任务
得到的Task,调用resume开始工作。
NSURLSessionTask的子类取消任务
当我们不打算使用了的网络请求,调用下面两个方法
当不再需要连接调用Session的invalidateAndCancel
直接关闭,或者调用finishTasksAndInvalidate
等待当前Task结束后关闭。
这时Delegate会收到URLSession:didBecomeInvalidWithError:
这个事件。Delegate收到这个事件之后会被解引用。
invalidateAndCancel
和finishTasksAndInvalidate
区别
前者直接关闭session的所有task,即使还有一些在等待,将要去执行,但是也取消了
后者是可以让等待的task继续执行,只是不去创建新的task了
各种代理方法
NSURLSessionDelegate等代理方法们~ 各种协议的关系图先去说说各种代理方法都是干啥的
1.NSURLSessionDelegate
@protocol NSURLSessionDelegate <NSObject>
@optional
/* 当Session invallid的时候,也是就调用了invalidateAndCancel 和
finishTasksAndInvalidate方法的时候,对调用这个代理方法
*/
- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(nullable NSError *)error;
/* NSURLSession接收到后台的挑战的时候,我们要在这里进行判断一下
*/
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler;
@end
2.NSURLSessionTaskDelegate
//与这个任务相关操作的消息
@protocol NSURLSessionTaskDelegate <NSURLSessionDelegate>
@optional
/* HTTP请求的时候,打算去请求一个新的URL
*/
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
willPerformHTTPRedirection:(NSHTTPURLResponse *)response
newRequest:(NSURLRequest *)request
completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler;
/* task接收到了一个挑战
*/
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler;
/* Sent as the last message related to a specific task. Error may be
* nil, which implies that no error occurred and this task is complete.
当task完成的时候调用
*/
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(nullable NSError *)error;
@end
3.NSURLSessionDataDelegate
/*
* Messages related to the operation of a task that delivers data
* directly to the delegate.
这个代理就是操作task的时候,传送数据的时候,一些message,如接收到相应,获取数据,获取数据完成
分为三步
1.收到相应头
2.收到数据
3.接收数据完成
*/
@protocol NSURLSessionDataDelegate <NSURLSessionTaskDelegate>
@optional
/* 1.收到了相应头
*/
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler;
/* 开始下载数据
*/
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask;
/* 接收到了数据
*/
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data;
/*缓存数据,这里可以使用系统默认的就行,这个是要将response缓存起来
*/
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
willCacheResponse:(NSCachedURLResponse *)proposedResponse
completionHandler:(void (^)(NSCachedURLResponse * _Nullable cachedResponse))completionHandler;
@end
4.NSURLSessionDownloadDelegate
@protocol NSURLSessionDownloadDelegate <NSURLSessionTaskDelegate>
/* 当下载完成的时候
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location;
@optional
/* 正在下载的时候 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;
/* 断点下载
* 断点下载开始了,会调用这个,fileOffset 在什么位置开始的,在资源处的大小是expectedTotalBytes
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didResumeAtOffset:(int64_t)fileOffset
expectedTotalBytes:(int64_t)expectedTotalBytes;
@end
网友评论