3

目前,当我打开一个 NSInputStream(例如)时,我可以将其设置为获取一个指示它已完全打开的事件。但如果失败,则根本没有任何事件。我从来没有被告知开幕未能完成。我可以在它试图打开时进行轮询,但是我必须在很长一段时间内占用一个线程。

我想做的是编写高效的代码来等待流打开或打开失败。有没有使用 NSStream 等的方法?

我还想创建一个可以等待一段时间的事件。如果连接成功,该事件将发出信号并将我弹出等待状态。如果发生超时,我可以测试状态并查看它是否失败或再次回到等待状态。但这当然是 B 计划,既不雄辩也不高效。并且查看 CocoaTouch 文档并不清楚如何创建这样一个我可以等待超时的信号。

任何帮助,将不胜感激。

4

1 回答 1

7

NSStream当 a无法打开时会发生一个事件: NSStreamEventErrorOccurred。也许您遇到的问题是 TCP/IP 超时可能很长。因此,如果与主机的连接将失败,则可能需要 30 秒才能收到此事件。

您可以同时启动一个NSTimer以较短的时间间隔打开流的时间,但是您会遇到该时间间隔应该是多少的问题?

通常最好将取消连接的选项留给用户,除非发生 TCP/IP 超时。

我在许多项目中所做的是在大约 1 秒后弹出一个带有活动指示器和取消按钮的自定义模式视图。本地网络上的许多连接将在此之前完成,用户不会被弹出窗口打扰。对于较慢的连接,这允许用户决定他们愿意等待多长时间。您甚至可以在更长的时间后更新模态视图中的消息,说连接比平时花费的时间更长,这样他们就知道程序知道他们正在等待!

于 2012-07-31T22:09:51.713 回答