Ios 函数体运行的次数与我显示的ViewController相同
我真的很困惑 我在ViewController中具有从服务器端发出listen socket.io的功能。 在我第一次打开视图控制器并从服务器获取消息后,一切正常。 但是,当我第二次打开ViewControllerusing present并从服务器获取消息时,该方法实际上运行了两次&运行次数与我显示ViewController的次数相同 我的职能是:Ios 函数体运行的次数与我显示的ViewController相同,ios,swift,socket.io,Ios,Swift,Socket.io,我真的很困惑 我在ViewController中具有从服务器端发出listen socket.io的功能。 在我第一次打开视图控制器并从服务器获取消息后,一切正常。 但是,当我第二次打开ViewControllerusing present并从服务器获取消息时,该方法实际上运行了两次&运行次数与我显示ViewController的次数相同 我的职能是: func sendMessageStatus() { var message_body: String! var send_
func sendMessageStatus() {
var message_body: String!
var send_time: String!
var chat_user_id: UInt!
let socket = SocketConfig.manager.defaultSocket
socket.on("messageReceived") { (dataArray, ack) in
let response = dataArray as NSArray
for resp in response {
let resp_dic = resp as! NSDictionary
for z in resp_dic {
if z.key as! String == "time_now" {
send_time = (z.value as! String)
}
if z.key as! String == "message_body" {
message_body = z.value as? String
}
if z.key as! String == "chat_id" {
chat_user_id = z.value as? UInt
self.chat_id = z.value as? UInt
}
}
}
// 0 user_id is the value for my id(i dont have my id and none of users id is 0 so i use this for know my messages)
let message_object = Messages(user_id: 0, message: message_body, receive_time: send_time)
if var items = messages_dic[chat_user_id] {
items.append(message_object)
messages_dic[chat_user_id] = items
}
else {
messages_dic[chat_user_id] = [message_object]
}
self.chatTableview.reloadData()
self.scrollToBottom(animated: true, delay: 0.3)
}
}
这个附加到我的信息中的次数与显示ViewController的次数相同
有谁能帮助解决这个问题?
谢谢。如果看不到ViewController的代码,很难说,但我猜它是否比您想象的更频繁地发送消息。可能是在一个document.ready函数或其他函数中。您的代码在这里看起来很好,从快速浏览 正如一位评论者所说,您可能存在内存泄漏。您的ViewController可能未正确释放 我建议在插座闭合中使用[弱自我]:
socket.on("messageReceived") { [weak self] (dataArray, ack) in
然后在插座闭合内,用self?替换self?。例如:
self?.chatTableview.reloadData()
我发现了我的问题
问题是每次我都会显示ViewController
socket.onmessageReceived
再次设置,并确保在显示ViewController时多次运行
所以为了解决这个问题,我使用套接字处理程序来检查我是否处理messageReceived set socket.on不再设置。
所以我用这个代码解决了这个问题
var is_set: Bool = false
let socket = SocketConfig.manager.defaultSocket
for handler in socket.handlers {
if handler.event == "messageReceived" {
is_set = true
}
}
if !is_set { // so set that
socket.on("messageReceived") { (dataArray, ack) in
// othere codes
}
另一种方法是,当我关闭ViewController时,我通过以下代码删除所有处理程序:
deinit() {
let socket = SocketConfig.manager.defaultSocket
socket.removeAllHandlers()
}
希望能帮助别人。听起来像是内存泄漏。确保没有任何强引用循环。我真的很困惑&不知道该怎么办。亲爱的迈克·塔凡纳:谢谢你的回答。我这样做,但在没有工作。