NSURLSession与线程问题

时间:2024-10-14 08:05:01

一.NSURLSession有两种使用方式:

1.

NSURLSession* session = [NSURLSession sharedSession]

此方式,没有设置NSURLSession的delegate,因此不会走代理接口,所以若要实现有意义的功能,在创建各种Task的时候,需要使用带completionHandler的接口,如:

  1. NSURLSessionDownloadTask* downloadTask = [session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
  2. }];


2.

  1. NSURLSession* session = [NSURLSessionsessionWithConfiguration:[NSURLSessionConfiguration
  2. 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的创建方式为   

  1. NSURLSession* session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration
  2. 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 allocinit],则不管session执行的线程为主线程还是子线程,block中的代码执行线程均为任意选择的子线程;



三.对于NSURLSession,当其在子线程中开启任务,并通过代理方式进行响应的处理时,此处不需要手动开启此线程的runloop,这一点不同于NSURLConnection。