ios-NSURLConnection多线程下的问题

首先先介绍下它的几个方法和一些基本的概念,当我们去使用了下面的代码去创建连接发送请求的时候,其实下载操作是在主线程中执行的

        NSURLConnection * conn = [NSURLConnection connectionWithRequest:request delegate:self];
       
        //4.启动连接
        [conn start];

根据这个方法的介绍,我们可以知道,有这么一段话


The delegate object for the connection. The connection calls methods on this delegate as the load progresses. Delegate methods are called on the same thread that called this method. For the connection to work correctly, the calling thread’s run loop must be operating in the default run loop mode.

其实就是说明了在调用该方法的线程下去调用代理方法,也就是说如果我们下面的代码是在主线程去调用的话,那么代码方法也会在主线程去执行。还有就是为了保证连接的正确,调用线程的Runloop必须运行在默认的运行循环的模式下

+ (NSURLConnection *)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate;
对于上述的问题,如果我们想要把代理方法去放到子线程去执行的话,那么我们就去设置代理方法执行的队列

       //设置代理方法执行的操作队列
        [conn setDelegateQueue:[[NSOperationQueue alloc]init]];
以及其实下载操作是在主线程上执行的,因为在我们进行下载的时候,我们去拖动textView的时候,下载是没有在进行的,因为拖动textView的时候模式已经是UITrackingRunLoopMode模式了,而我们下载是其实在start方法中也是有所提示的。

那么问题来了,如果我们直接想把这个操作放在子线程下是不行的,因为没有开启运行循环,我们必须要去开启运行循环才能去监听这个网络事件,才能运行,其实上面start方法也有解释的。没有运行循环肯定无法执行,所以我们要去开启运行循环,我们可以采取Core Foundation中的CFRunLoop来做。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值