Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift套接字IO:关闭套接字不会停止重新连接尝试_Swift_Socket.io - Fatal编程技术网

Swift套接字IO:关闭套接字不会停止重新连接尝试

Swift套接字IO:关闭套接字不会停止重新连接尝试,swift,socket.io,Swift,Socket.io,我今天在做一些代码重构,我注意到关闭socket IO中的套接字并不会停止重新连接的尝试。我想到的唯一解决方案是在关闭套接字时将socketManager.reconnects设置为false,在再次连接时将其设置为true,但我在这里也遇到了一个问题 当我关闭套接字并将“重新连接”设置为false时,重新连接尝试会按预期停止,但随后我将其设置为true并尝试连接,并且只进行了一次连接尝试,它不会再次尝试重新连接。我检查了套接字管理器。“重新连接”值,该值确实设置为true,但不会发生重新连接尝

我今天在做一些代码重构,我注意到关闭socket IO中的套接字并不会停止重新连接的尝试。我想到的唯一解决方案是在关闭套接字时将socketManager.reconnects设置为false,在再次连接时将其设置为true,但我在这里也遇到了一个问题

当我关闭套接字并将“重新连接”设置为false时,重新连接尝试会按预期停止,但随后我将其设置为true并尝试连接,并且只进行了一次连接尝试,它不会再次尝试重新连接。我检查了套接字管理器。“重新连接”值,该值确实设置为true,但不会发生重新连接尝试

我是做错了什么,还是图书馆里有个bug。这是我的密码

let socketManager = SocketManager(socketURL: URL(string: Constants.serverSocketURL)!, config: [.log(true), .reconnects(true), .reconnectAttempts(500), .reconnectWait(1)])

lazy var socket = socketManager.defaultSocket

func establishConnection() {
    socketManager.reconnects = true
    if !self.isConnected() {
        print(self.socketManager.reconnects)
        socket.connect(timeoutAfter: 7.0) {
            Logger.log(message: "Socket connection timeout", event: .i)
        }
    }
}

func closeConnection() {
    turnOffListeners()
    socket.disconnect()
    socketManager.reconnects = false
}

如果看不到更多的代码,就很难找到真正的问题。我现在可以做的是向您展示我在Swift中对Socket.io的实现。也许这对你有帮助

SocketHelper.swift

class SocketHelper: NSObject {

    static let shared = SocketHelper()

    private let manager = SocketManager(
        socketURL: URL(string: ApiConstants.Routes.URL)!,
        config: [.forceNew(true)]
    )

    private var socket: SocketIOClient!

    var isConnected: Bool = false

    private override init() {
        super.init()

        socket = manager.defaultSocket

        socket.on(clientEvent: .connect, callback: { data, ack in
            print("SocketManager: connected")
            self.isConnected = true
            self.sendNotification(event: "CONNECTED")
        })

        socket.on(clientEvent: .disconnect, callback: { data, ack in
            print("SocketManager: disconnected")
            self.isConnected = false
            self.sendNotification(event: "DISCONNECTED")
        })
    }

    private func sendNotification(event: String) {
        NotificationCenter.default.post(name: NSNotification.Name(event), object: nil)
    }

    func connect() {
        if !isConnected {
            socket.connect()
        }
    }

    func disconnect() {
        if isConnected {
            socket.disconnect()
        }
    }
}
然后在ViewController中,您应该注册观察者:

NotificationCenter.default.addObserver(self, selector: #selector(socketConnected), name: NSNotification.Name("CONNECTED"), object: nil)

NotificationCenter.default.addObserver(self, selector: #selector(socketDisconnected), name: NSNotification.Name("DISCONNECTED"), object: nil)
连接到插座:

SocketHelper.shared.connect()
等待事件:

@objc func socketConnected() {
    //connected
}

@objc func socketDisconnected() {
    //disconnected
}

这个对我来说很好,不过,它在完全停止之前又尝试了一次

socket.io客户端“:“2.2.0”


此.socket.io.重新连接尝试(0)

您在哪个队列上运行此操作?您可以尝试使用主队列吗?即
DispatchQueue.main
?对meHuh来说,这听起来像是一个竞争条件,这是一个有趣的想法。当您说这可能是一个竞争条件时,您是在谈论断开连接不会停止重新连接尝试,还是设置reconnects=true已经停止了没有效果?“是的,可能是任何一个在没有看到更多代码的情况下很难判断的问题,也可能是每个新连接都实例化了一个新的管理器副本,导致多个实例共存,最简单的方法是测试并排除这是否是我尝试运行socketManager的caseMostafa。重新连接更改并连接DispatchQueue.main.sync中的中断和断开连接,但没有任何区别。在断开连接调用后尝试连接仍然只会进行一次重新连接尝试。请检查Kai,我在代码中执行的操作基本相同。唯一的区别是,我对套接字管理器配置使用了以下配置:[.log(false),.reconnects(true),.reconnectAttempts(500),.reconnectWait(1)]请为您的答案添加一些解释,以便其他人可以从中学习