一.NSURLSession有两种使用方式:
1.
NSURLSession* session = [NSURLSession sharedSession]
此方式,没有设置NSURLSession的delegate,因此不会走代理接口,所以若要实现有意义的功能,在创建各种Task的时候,需要使用带completionHandler的接口,如:
-
NSURLSessionDownloadTask* downloadTask = [session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
-
}];
2.
-
NSURLSession* session = [NSURLSessionsessionWithConfiguration:[NSURLSessionConfiguration
-
defaultSessionConfiguration]delegate:selfdelegateQueue:nil];
此方式下,已经设置NSURLSession的delegate,因此期望会对返回的响应及数据走代理方式进行处理,但是,需要注意的是,如果在创建Task的时候,使用了带有completionHandler参数的方式,则响应仍然会在com,pletionHandler的block中进行处理,并且不会走代理接口。因此,若保证响应走代理接口,则要使用不带completionHandler参数的接口,或者将completionHandler的block置为nil。
二.响应的执行线程问题:
1.对于创建的task,如果其响应处理的方式为通过上述completionHandler中block的方式处理:
1)若session的创建方式为NSURLSession* session = [NSURLSession sharedSession],则不管session执行的线程为主线程还是子线程,block中的代码执行线程均为任意选择的子线程。
2)若session的创建方式为
-
NSURLSession* session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration
-
defaultSessionConfiguration] delegate:self delegateQueue:nil],
若delegateQueue = nil,则不管session执行的线程为主线程还是子线程,block中的代码执行线程均为任意选择的子线程;
若delegateQueue = [NSOperationQueue mainQueue],则不管session执行的线程为主线程还是子线程,则block中的代码执行线程为主线程中执行;
若delegateQueue = [[NSOperationQueue alloc]init],则不管session执行的线程为主线程还是子线程,block中的代码执行线程均为任意选择的子线程;
2.对于创建的task,如果其响应处理的方式为通过上述delegate代理借口的方式处理:
若delegateQueue = nil,则不管session执行的线程为主线程还是子线程,block中的代码执行线程均为任意选择的子线程;
若delegateQueue = [NSOperationQueue mainQueue],则不管session执行的线程为主线程还是子线程,则block中的代码执行线程为主线程中执行;
若delegateQueue = [[NSOperationQueue alloc] init],则不管session执行的线程为主线程还是子线程,block中的代码执行线程均为任意选择的子线程;
三.对于NSURLSession,当其在子线程中开启任务,并通过代理方式进行响应的处理时,此处不需要手动开启此线程的runloop,这一点不同于NSURLConnection。