我真的很困惑。
我有一个函数侦听socket.io从我的ViewController服务器端发出。在我第一次打开视图控制器并从服务器获取消息后,一切正常。但是当我第二次打开ViewController(使用present)并从服务器获取消息时,这个方法实际上运行了两次,并且与我呈现的ViewController一样多次。
我的功能是:
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)
}
}
并且这跟我的messages_dic一样多次出现在ViewController中。
任何人都可以帮忙解决这个问题?谢谢。
很难说没有看到你的ViewController的代码,但我猜想是否比你想象的更频繁地发出"messageReceived"
。也许是在document.ready()
功能或其他一些功能。从快速浏览一下,这里的代码似乎没问题。
正如一位评论者所说,你可能有内存泄漏。您的ViewController可能无法正常发布。
我建议在你的socket闭包中使用[weak self]
:
socket.on("messageReceived") { [weak self] (dataArray, ack) in
然后在你的套接字闭包中,用self
替换self?
。例如:
self?.chatTableview.reloadData()
我发现了我的问题。
问题是每次我再次设置ViewController socket.on(“messageReceived”)并且肯定会像我呈现ViewController一样多次运行。
所以为了解决问题我使用套接字处理程序检查我是否处理“messageReceived”(设置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()
}
希望能帮助别人。