NSURLSession与线程问题

本文探讨NSURLSession的两种使用方式及其线程行为。当不设置delegate时,响应处理通过completionHandler;设置delegate时,若使用completionHandler,响应仍在线程内处理。关于线程问题,completionHandler执行线程取决于delegateQueue,而代理方法执行线程同样受delegateQueue影响。需要注意,使用NSURLSession无需手动开启子线程的runloop,与NSURLConnection不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.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 allocinit],则不管session执行的线程为主线程还是子线程,block中的代码执行线程均为任意选择的子线程;



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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值