NSURLSession介绍

2017-05-04  本文已影响21人  白河三

一、NSURLSessionTask 的子类

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

1、NSURLSessionDataTask

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

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

2、 NSURLSessionDownloadTask

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

3、相关代理

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;
}
上一篇下一篇

猜你喜欢

热点阅读