【问题标题】:When would you want to run an NSURLConnection on a secondary thread?您什么时候想在辅助线程上运行 NSURLConnection?
【发布时间】:2012-12-11 18:19:20
【问题描述】:

我们正在编写一个大量使用 NSURLConnection 的 SDK。要管理所有这些连接(例如,批量取消它们),最好它们都在单个线程(最好是主线程)上运行。由于 NSURLConnection 的异步特性,这并不是一个糟糕的想法——在我们的独立应用程序中,我们所有的连接都运行在主线程上,而连接后的繁重工作则在辅助线程(实际上是使用 GCD 或操作队列)上执行结果得到了,没有什么停滞不前。

所以问题是 - 在哪些情况下,用户会希望在多个线程上运行连接,以及在不是主线程的线程上运行?

编辑:我想我没有正确解释自己。我们以异步而非同步的方式使用 NSURLConnection。这允许我们在不阻塞 UI 的情况下在主线程上运行所有连接。问题是:我们 SDK 的用户何时希望在异步和不同线程上运行这些连接?

【问题讨论】:

  • 使用NSOperationQueue。它具有cancel the operations 的属性。
  • 不是每个NSURLConnection 都在后台线程上运行吗?
  • sendSynchronousRequest:returningResponse:error 方法阻塞了调用它的线程。

标签: objective-c ios nsurlconnection


【解决方案1】:

我可以想象在另一个线程上运行异步 NSURLConnection 的唯一充分理由是,如果您的委托方法本身非常耗时。即便如此,我可能仍会在主线程上运行它,并将处理移至后台队列。

编辑:请注意,今天“将处理移至后台线程”非常容易。在 GCD 之前,这有点困难,因此在辅助线程上运行 NSURLConnection 本身在这种情况下可能更有用。当您将 NSURLConnection 嵌入到不处理主线程上的 runloop 的 C++ 应用程序中时,它仍然有些用处(这基本上只适用于 Mac 应用程序)。

据我所知,NSURLConnection 已经管理自己的后台线程供其内部使用。

简而言之,我相信您对此的直觉是正确的。答案是“几乎从来没有”。 NSURLConnection 最容易在主线程上管理。

【讨论】:

  • 感谢您的意见。我想稍等片刻,等待不同意见。如果它不存在,我会接受你的回答:-)
  • 嗯,要分享吗? :-)
【解决方案2】:

当您有一个加载大量数据的请求并且您确信它会很慢,并且您有一个需要经常呈现的 GUI。
这种情况下,如果 GUI(如在 Cocoa 中,GUI 在主线程中更新)在主线程中更新,请求太慢可能会导致所有视图停止显示,因为它们没有更新。

Apple 文档中也有关于 sendSynchronousRequest:returningResponse:error 的说明:

重要提示:由于此调用可能需要几分钟才能失败(尤其是在 iOS 中使用蜂窝网络时),因此您永远不应从 GUI 应用程序的主线程调用此函数。 p>

【讨论】:

  • 感谢您的意见,但我认为存在误解 - 请查看我的编辑。
  • 所以你是从另一个线程调用它。如果这个线程做重要的事情并且你不想阻塞它,你使用异步请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多