Swift套接字IO:关闭套接字不会停止重新连接尝试
我今天在做一些代码重构,我注意到关闭socket IO中的套接字并不会停止重新连接的尝试。我想到的唯一解决方案是在关闭套接字时将socketManager.reconnects设置为false,在再次连接时将其设置为true,但我在这里也遇到了一个问题 当我关闭套接字并将“重新连接”设置为false时,重新连接尝试会按预期停止,但随后我将其设置为true并尝试连接,并且只进行了一次连接尝试,它不会再次尝试重新连接。我检查了套接字管理器。“重新连接”值,该值确实设置为true,但不会发生重新连接尝试 我是做错了什么,还是图书馆里有个bug。这是我的密码Swift套接字IO:关闭套接字不会停止重新连接尝试,swift,socket.io,Swift,Socket.io,我今天在做一些代码重构,我注意到关闭socket IO中的套接字并不会停止重新连接的尝试。我想到的唯一解决方案是在关闭套接字时将socketManager.reconnects设置为false,在再次连接时将其设置为true,但我在这里也遇到了一个问题 当我关闭套接字并将“重新连接”设置为false时,重新连接尝试会按预期停止,但随后我将其设置为true并尝试连接,并且只进行了一次连接尝试,它不会再次尝试重新连接。我检查了套接字管理器。“重新连接”值,该值确实设置为true,但不会发生重新连接尝
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)]请为您的答案添加一些解释,以便其他人可以从中学习