ios-NSURLConnection多线程下的问题

来源:互联网 发布:linux signal 11 编辑:程序博客网 时间:2024/06/06 03:46

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

        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
原创粉丝点击