iOS-在整个iOS应用程序中实现websocket连接的最佳解决方案



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

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

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

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

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

编辑以下评论更新要求:

要求似乎是,无论视图控制器如何,您都希望能够始终接收消息,但能够通过视图控制器发布消息。

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

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

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

这里有很多工作要做。

最新更新