0

这是 WWDC 2010 会议 208 的幻灯片:

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

将多个 conn 放入 currentRunLoop 是否有任何问题?

在后台线程的运行循环中调度 NSURLConnection 有什么好处?

谢谢!

4

1 回答 1

2

您使用短语“辅助运行循环”表明您不知道运行循环是什么。

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

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

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

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

现在,线程。

产生一个大部分时间处于空闲状态的后台线程几乎没有什么意义。NSURLConnection 应该很少处理(你一开始就不能把那么多带宽放到电话里);在主运行循环中运行它几乎没有任何开销;线程往往有更大的开销。

如果您正在处理数据,并且处理是 CPU 密集型的,您可能希望它在后台线程中运行。您可以将连接放在后台线程中,但一般来说,在主线程中尽可能多地做会更容易。

而且我不会开始讨论线程间通信问题,因为它们是一个主要的痛苦。仅在您知道需要时才使用并发。

(在 iPhone 变成双核之前,几乎可以肯定,你编写的 99% 的代码都不需要它。)

于 2010-08-17T03:36:16.343 回答