函数体运行与我呈现的ViewController一样多次

问题描述 投票:0回答:3

我真的很困惑。

我有一个函数侦听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中。

任何人都可以帮忙解决这个问题?谢谢。

ios swift socket.io
3个回答
1
投票

很难说没有看到你的ViewController的代码,但我猜想是否比你想象的更频繁地发出"messageReceived"。也许是在document.ready()功能或其他一些功能。从快速浏览一下,这里的代码似乎没问题。


0
投票

正如一位评论者所说,你可能有内存泄漏。您的ViewController可能无法正常发布。

我建议在你的socket闭包中使用[weak self]

socket.on("messageReceived") { [weak self] (dataArray, ack) in

然后在你的套接字闭包中,用self替换self?。例如:

self?.chatTableview.reloadData()

0
投票

我发现了我的问题。

问题是每次我再次设置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()
 }

希望能帮助别人。

© www.soinside.com 2019 - 2024. All rights reserved.