4

我注意到如果我创建一个 NSURLConnection 并触发请求,一切都很好。在调用连接的代码块完成后,我的委托方法被调用,最后一个委托方法被调用。伟大的。

这让我相信连接是异步的,这意味着它们是多线程的。那是对的吗?它们可以是异步的但在同一个线程中吗?不,这太疯狂了——对吧?

但是,在我看到的每个使用 NSOperation 的示例中,NSURLConnections 总是在 scheduleInRunLoop 之后在 while 循环中调用 [runLoop runMode ...] 。

有人可以准确解释这里发生了什么吗?在我看来,第一种情况需要生成辅助线程,但不需要手动调用运行循环(在那些线程上),而 NSOperation(在新线程中)确实需要手动调用运行循环。

为什么第一种情况不需要手动调用?

4

3 回答 3

4

NSURLConnection确实会产生一个后台线程来管理其自身的所有实例,但这通常与调用者无关,因为委托调用是在拥有连接调度的 runloop 的任何线程上进行的。(事实证明,这个事实与我最近,但这些事情真的只有在处理多线程应用程序中的疯狂崩溃时才会出现。)

有关更多与调用者相关的详细信息,您应该查看-[NSURLConnection scheduleInRunLoop:forMode:]. 它解释了如何手动处理调度和取消调度,以及 NSURLConnections 在多线程环境中的行为。

如果您不清楚运行循环如何工作以及它们如何在不需要额外线程的情况下执行异步操作,您应该阅读线程编程指南中的运行循环。这是转向更高级的 Cocoa 开发的一个非常重要的主题。

于 2011-03-03T22:36:27.560 回答
0

因为主线程已经有一个运行循环,我想。

于 2011-03-03T22:26:25.077 回答
0

如果你想在另一个线程中运行 NSURLConnection,你应该在你的线程的 main 方法中创建一个这样的运行循环:

while (!finished)
{
  [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
于 2013-08-15T14:08:53.040 回答