一、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>)
二、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;
}