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
Ios 函数体运行的次数与我显示的ViewController相同_Ios_Swift_Socket.io - Fatal编程技术网

Ios 函数体运行的次数与我显示的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_

我真的很困惑

我在ViewController中具有从服务器端发出listen socket.io的功能。 在我第一次打开视图控制器并从服务器获取消息后,一切正常。 但是,当我第二次打开ViewControllerusing 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)
    }

}
这个附加到我的信息中的次数与显示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()
 }

希望能帮助别人。

听起来像是内存泄漏。确保没有任何强引用循环。我真的很困惑&不知道该怎么办。亲爱的迈克·塔凡纳:谢谢你的回答。我这样做,但在没有工作。