【问题标题】:Why There Is No Need To Open A New Thread When Opening A Socket Connection In iOS为什么在 iOS 中打开 Socket 连接时不需要打开新线程
【发布时间】:2015-09-09 02:21:36
【问题描述】:

之前我在开发Android应用的时候,涉及到socket连接,总是需要开一个新的Thread来处理,否则肯定会报错。

另一方面,当我在 iOS 应用程序中做同样的事情时,我不需要打开一个新线程来处理这些套接字连接,我的 UI 仍然可以流畅运行。我不明白为什么会这样。

我已经做了一些研究,但我没有找到任何解释这个问题的来源。

请帮助我理解这一点。提前致谢!

【问题讨论】:

  • 根据您使用的 iOS API,它可能正在执行与事件循环集成的异步/非阻塞 I/O。 Android 可能提供也可能不提供此功能;我不确定。
  • 您是否使用库来处理套接字,例如 GCDAsyncSocket?因为这将为您处理线程
  • @Fonix 是的,我也在使用它。所以这就是为什么。我真傻,没想到……
  • @icktoofay 谢谢,我早该想到的。

标签: ios multithreading sockets


【解决方案1】:

正如@Fonix 所说,如果您使用 GCDAsyncSocket,它会为您处理并发。但是如果您阅读 GCDAsyncSocket 代码,您会注意到它也不会生成任何线程。 iOS 中几乎没有任何东西会生成自己的线程。对NSThread 的引用几乎总是一个错误。 iOS 并发基于队列,由 GCD(Grand Central Dispatch)管理。队列最终会映射到线程,但这是内部细节,不是 1:1 映射。

您需要阅读Concurrency Programming Guide,尤其是“Migrating Away from Threads”,以了解 iOS 如何管理并发。它与 Android 完全不同,这种误解通常会导致大量 iOS 代码损坏。

【讨论】:

    猜你喜欢
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多