"尝试连接已连接的插座" - Socket.IO-Client-Swift

时间:2018-01-31 21:40:15

标签: ios sockets socket.io swift4

我正在使用swift 4和Socket.IO-Client-Swift,'〜> 13.1.1' (最新版本)。 我尝试在添加套接字处理程序后调用socket.connect()但是我收到错误"当引擎未打开时尝试连接套接字"。所以我在一个计时器中添加了socket.connect()代码,并在5秒后调用它,因此那时引擎已经打开并且不再出现该错误。

但现在我收到了错误"尝试连接已连接的套接字",即使从未调用过连接客户端事件处理程序。

我已经阅读了文档和git上发布的所有问题,但没有解释如何解决这个问题,或者为什么会发生此错误。

您可以在下面找到代码和控制台日志。

 let manager = SocketManager(socketURL: URL(string: "https://socket.******.**")!, config: [.log(true),.connectParams(["token":Utils.getToken()]),.reconnects(true)])
 socket = manager.socket(forNamespace: "/**********")


console log:
   2018-02-01 02:20:00.810496+0530 *******[2476:1630437] LOG SocketIOClient{/**********}: Adding handler for event: connect
   2018-02-01 02:20:00.837403+0530 *******[2476:1630437] LOG SocketIOClient{/**********}: Adding handler for event: message
   2018-02-01 02:20:00.838168+0530 *******[2476:1630437] LOG SocketManager: Manager is being released
   2018-02-01 02:20:05.815458+0530 *******[2476:1630437] LOG SocketIOClient{/**********}: Tried connecting on an already connected socket

从控制台日志中,您可以看到我正在获得"经理正在被发布"错误消息有没有办法保留经理对象?这是这个问题背后的主要原因吗?

1 个答案:

答案 0 :(得分:4)

管理员保留通过管理器创建的套接字。因此,至少必须保持对管理器的强引用,以保持套接字的活跃性。 (根据文档,https://nuclearace.github.io/Socket.IO-Client-Swift/Classes/SocketManager.html

解决此问题的最简单方法是创建单例类以保留管理器对象

    open class SocketConnection {

        open static let `default` = SocketConnection()
        private let manager: SocketManager
        private var socket: SocketIOClient

        private init() {
             manager = SocketManager(socketURL: URL(string: "https://socket.******.**")!, config: [.log(true),.connectParams(["token":Utils.getToken()]),.reconnects(true)])
             socket = manager.socket(forNamespace: "/**********")
        }
    }