【问题标题】:ios multiple NSStream handlersios 多个 NSStream 处理程序
【发布时间】:2014-05-17 07:59:52
【问题描述】:

我是 ios 编程新手。我的应用程序正在链接一个打开 NSStream 并使用它们的库,如下所示:

[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                       forMode:NSRunLoopCommonModes];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
                        forMode:NSRunLoopCommonModes];

: 以上流的事件由

处理 - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode

在同一个文件中(或默认线程?)

我需要在另一个上下文中与服务器交谈,如果我使用 NSStreams,我是否必须设置不同的线程/运行循环?我不想碰上面的库代码。我怎样才能有另一个流处理回调?

我看到了这篇文章。这适用吗?

NSStream and Sockets, NSStreamDelegate methods not being called

谢谢

【问题讨论】:

    标签: ios nsrunloop nsstream


    【解决方案1】:

    您发布的链接是关于“套接字流”的。 “套接字流”是一个聪明的 Posix 事物,其中您有一个输出流和一个输入流由操作系统连接在一起,并且您写入输出流的所有内容都会自动显示为输入流中的输入。很可能不是你想要的。

    如果您有多个输入和输出流,您可以将它们全部安排在同一个运行循环中。通常你只需将它们安排在主线程的运行循环中。如果您使用 lots 的流,以便在主线程中处理流数据会影响应用程序的响应能力,那么您可以创建一个仅用于处理流的额外线程,并安排其中的所有内容线程的运行循环。

    【讨论】:

    • 您提到的内容听起来像是 unix 中的管道。 @gnasher729:是的,我也在谈论套接字。我链接的图书馆是发送电子邮件的公共域 sksmtp。我需要编写 tcp 客户端代码来与我的服务器通信。如何在我的代码中处理 tcp 套接字?任何时候只有一个套接字处于活动状态。谢谢。
    【解决方案2】:

    正如您在引用的代码中看到的那样,您将流安排在定义为当前线程的运行循环的“currentRunLoop”中。这意味着如果您在首先创建的某个 NSThread 的上下文中调用这些行 - 您将在该线程的上下文中接收流事件。因此,您不必更改这些行 - 只需确保在要用于网络的同一线程中执行它们即可。

    【讨论】:

      猜你喜欢
      • 2018-05-03
      • 2013-11-24
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 2017-07-29
      相关资源
      最近更新 更多