异步NSURLConnection是多线程的

时间:2011-03-03 22:16:06

标签: cocoa ios nsurlconnection nsrunloop

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

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

但是,在我看过使用NSOperation的每个例子中,NSURLConnections始终是scheduledInRunLoop,之后在while循环中调用[runLoop runMode ...]。

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

while (!finished)
{
  [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}