调度异步下载主线程的runloop vs bg线程的iOS上的runloop?

时间:2010-08-17 01:44:44

标签: iphone nsurlconnection nsrunloop

以下是WWDC 2010会议208的幻灯片:

conn = [[NSURLConnection alloc] initWithRequest:req
  delegate:self startImmediately:NO];
[conn scheduleInRunLoop: [NSRunLoop currentRunLoop]
  forMode: NSDefaultRunLoopMode];
[conn start];

在currentRunLoop中放置多个conn有什么问题吗?

在后台线程的runloop中安排NSURLConnection有什么好处?

谢谢!

1 个答案:

答案 0 :(得分:2)

您使用短语“secondary runloop”表示您不知道运行循环是什么。

NSRunLoop是线程的“主循环”的实现。或多或少,

while ([runLoop waitNextEvent]) {
    NSAutoreleasePool * pool = [NSAutoreleasePool new];
    [runLoop handleEvent];
    [pool release]; pool = nil;
}

运行循环有一个线程。每个线程最多有一个运行循环。 “performSelectorOnMainThread”在运行循环上调度它,但程序员通常会讨论线程,而不是它正在使用的任何运行循环抽象,因为它们都是相同的。并非所有线程都有运行循环(NSThread的函数通常会给你一个没有运行循环的线程;我认为如果你需要,你必须自己创建一个运行循环。)

“currentRunLoop”是当前正在执行的线程的运行循环。除非你使用了NSOperation / dispatch _ * / etc,否则这可能可能主线程。如果你在另一个线程上安排它,那么(我认为)委托回调从另一个线程运行。你可能不希望这种情况发生。

现在,线程。

产生大多数时间闲置的后台线程几乎没有什么意义。 NSURLConnection应该进行非常少的处理(首先你不能在手机中获得那么多的带宽);在主运行循环中运行它几乎没有任何开销;线程往往有更大的开销。

如果您正在处理数据,并且处理是CPU密集型的,那么您可能希望它在后台线程中运行。您可以将连接放在后台线程中,但通常在主线程中尽可能地更容易。

我不会开始讨论线程间通信问题,因为它们是一个很大的痛苦。如果您知道自己需要它,请仅使用并发。

(直到iPhone推出双核,你几乎肯定不需要你编写99%的代码。)