NSURLSession的一些代理方法

作者: mkb2 | 来源:发表于2017-03-28 15:08 被阅读824次

    说在前边
    只是感觉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使用说明及后台工作流程分析

    相关文章

      网友评论

        本文标题:NSURLSession的一些代理方法

        本文链接:https://www.haomeiwen.com/subject/lhsjottx.html