iOS网络IOS知识积累iOS知识点

NSURLSession的一些代理方法

2017-03-28  本文已影响824人  mkb2

说在前边
只是感觉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收到这个事件之后会被解引用。

invalidateAndCancelfinishTasksAndInvalidate区别
前者直接关闭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

参考文章
ios NSURLSession使用说明及后台工作流程分析

上一篇 下一篇

猜你喜欢

热点阅读