4

在我的应用程序中,websocket连接和通信是确定的,ViewController但后来请求通过websocket整个应用程序接收消息。

最好的方法是什么?将websocket代码移动到AppDelegate或创建 super ViewController?还是其他更好的东西?

4

1 回答 1

4

如果要求您的应用程序始终与外部方通信,并且多个视图控制器可以呈现和处理消息,那么您需要将通信移到单独的实例并为您的视图控制器提供一个接口与之互动。

我将创建一个通信类或一组类,您可以在 appDelegate 中创建一个共享实例。然后,不同的视图控制器可以通过 appDelegate 或您提供的其他机制访问此共享实例。

这将有多么复杂取决于您的确切要求。

编辑以下评论更新要求:

要求似乎是您希望能够一直接收消息,而不管视图控制器如何,但能够通过视图控制器发布消息。

为此,您希望共享实例提供用于打开连接的 API。让它注册在runloop上连接的web socket(s)(不确定你使用的是哪个web socket API),这样你就可以在有活动时处理通信,在没有活动时做其他事情。您可以在主线程或后台线程上执行此操作,这完全取决于您认为消息传递会增加多少负载。

让您的新共享实例处理所有传入消息并将它们放入内部队列中。为客户端实例(如您的视图控制器)提供订阅接口以注册传入消息通知。您可以将其设为直接界面或使用通知。您的选择取决于用例。如果视图控制器可以及时返回,那么您需要提供对过去接收和发送的完整消息集的访问权限。除非消息是短暂的并且您不存储任何历史记录,否则将需要清除这些消息或缓存到文件的策略。

要发送消息,请在共享实例中提供一个 API,该 API 允许将消息排队等待发送,并带有未来的确认。使用运行循环机制在套接字准备好写入以发送消息时得到通知。向发送 UI 提供消息已发送确认,以便 UI 不会被阻止等待发送,并允许在第一个消息挂起时写入其他消息。

这里有很多工作要做。

于 2015-04-28T10:11:10.970 回答