美文网首页
NSURLSession介绍

NSURLSession介绍

作者: 白河三 | 来源:发表于2017-05-04 16:43 被阅读21次

    一、NSURLSessionTask 的子类

    NSURLSessionTask 是一个抽象类,如果要使用那么只能使用它的子类
    NSURLSessionTask 有两个子类(NSURLSessionDataTask,NSURLSessionDownloadTask)

    1、NSURLSessionDataTask

    NSURLSessionDataTask,可以用来处理一般的网络请求,如 GET | POST 请求等
    NSURLSessionUploadTask是NSURLSessionDataTask子类主要用于处理上传请求

    可以使用block回调方法和设置代理来处理请求返回

    2、 NSURLSessionDownloadTask

    主要用于处理下载请求,有很大的优势

    3、相关代理
    • NSURLSessionTask (抽象类,NSURLSessionTaskDelegate<NSURLSessionDelegate>)

    NSURLSessionDataTask (NSURLSessionDataDelegate<NSURLSessionTaskDelegate>)
    NSURLSessionUploadTask (NSURLSessionDataDelegate<NSURLSessionTaskDelegate>)
    NSURLSessionDownloadTask (NSURLSessionDownloadDelegate<NSURLSessionTaskDelegate>)

    2997426-7e7b79022303d11e.png

    二、NSURLSessionConfiguration

    首先看一下NSURLSessionConfiguration部分。从这个名字,我们可以预感到这个是与session的配置相关的,的确也是这样。总共有三种类型的configuratin,另外还有很多属性,比如配置缓存策略的requestCachePolicy,请求超时的timeoutIntervalForRequest,添加额外请求头的HTTPAdditionalHeaders,其他还有很多属性这里就不一一说了,具体看源

    //默认的配置会将缓存存储在磁盘上
    @property (class, readonly, strong) NSURLSessionConfiguration *defaultSessionConfiguration;
    //第二种瞬时会话模式不会创建持久性存储的缓存.
    @property (class, readonly, strong) NSURLSessionConfiguration *ephemeralSessionConfiguration;
    //第三种后台会话模式允许程序在后台进行上传下载工作
    + (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier;
    //各种属性
    @property NSURLRequestCachePolicy requestCachePolicy;
    @property NSTimeInterval timeoutIntervalForRequest;
    @property (nullable, copy) NSDictionary *HTTPAdditionalHeaders;
    

    三、NSURLSessionDataTask 发送 GET 请求

    设置代理循环应用的问题

    /**
      第一个参数:配置信息
      第二个参数:设置代理
      第三个参数:队列,如果该参数传递nil 那么默认在子线程中执行
      */
     NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
                                  delegate:self delegateQueue:nil];
    

    设置代理之后的强引用问题

    NSURLSession 对象在使用的时候,如果设置了代理,那么 session 会对代理对象保持一个强引用,在合适的时候应该主动进行释放
    可以在控制器调用 viewDidDisappear 方法的时候来进行处理,可以通过调用 invalidateAndCancel 方法或者是 finishTasksAndInvalidate 方法来释放对代理对象的强引用

    invalidateAndCancel 方法直接取消请求然后释放代理对象
    finishTasksAndInvalidate 方法等请求完成之后释放代理对象。

    [self.session finishTasksAndInvalidate];
    

    在我们使用Afnetworking时,一般设置单例来解决循环引用

    +(AFHTTPSessionManager *)defaultSessionManager
    {
        //1.获得请求管理者
        static AFHTTPSessionManager *mgr = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            
            if (mgr == nil) {
                
                mgr = [AFHTTPSessionManager manager];
                mgr.responseSerializer = [AFJSONResponseSerializer serializer];
                mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/x-json", @"text/json", @"text/javascript", @"text/html", @"application/json", nil];
                NSString *sessionid = NEPUserDefaultQuery(@"sessionid");
                
                if (sessionid.length != 0) {
                    [mgr.requestSerializer setValue:[NSString stringWithFormat:@"JSESSIONID=%@",sessionid] forHTTPHeaderField:@"Cookie"];
                }
                
                // 设置超时时间
                [mgr.requestSerializer willChangeValueForKey:@"timeoutInterval"];
                mgr.requestSerializer.timeoutInterval = 15.f;
                [mgr.requestSerializer didChangeValueForKey:@"timeoutInterval"];
            }
        });
    
        return mgr;
    }
    

    相关文章

      网友评论

          本文标题: NSURLSession介绍

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