ios - Swift 和 Socket.io : Event doesn't run anymore when re-open a controller

标签 ios iphone node.js swift socket.io

我是 Swift 和 Socket.io 的初学者。我正在使用的 Swift 的 socket.io 库是 https://github.com/nuclearace/Socket.IO-Client-Swift

为了在多个 Controller 中使用 1 个 socket.io 连接,我在 Singleton_SocketManager.swift 中使用带有以下代码的 Singleton:

import Foundation

class Singleton_SocketManager {
    static let sharedInstance = Singleton_SocketManager()
    let socket = SocketIOClient(socketURL: "localhost:3000")
    var currentController = ""
    var loadedHander = [String: Bool]()
    var currentRoomId = 0

    init() {
        loadedHander["ViewController"] = false
        loadedHander["NextViewController"] = false
    }
}

let sharedSocket = Singleton_SocketManager()

为了在每个 Controller 中添加事件处理程序,我在 viewDidLoad() 中调用了 addHandlers() 函数,并调用了 addHandlers() 的代码:

对于 View Controller :

func addHandlers() {
    if (sharedSocket.loadedHander["ViewController"]!) {
        return;
    } else {
        sharedSocket.loadedHander["ViewController"] = true
    }

    sharedSocket.socket.on("eventInViewController1") {[weak self] data, ack in
        println("View Controller: Event 1")
    }
}

对于 NextViewController:

func addHandlers() {
    if (sharedSocket.loadedHander["NextViewController"]!) {
        return;
    } else {
        sharedSocket.loadedHander["NextViewController"] = true
    }

    sharedSocket.socket.on("eventInNextViewController1") {[weak self] data, ack in
        println("NextViewController: Event 1")
    }
}

他们第一次运行得很好。但是,如果我必须使用此代码更改 Controller :

let storyBoard = self.storyboard
let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("NextViewController") as! NextViewController
self.presentViewController(nextViewController, animated: false, completion: nil)

并使用相同的代码返回到 ViewController,旧的事件处理程序将不会运行。我知道我可以通过删除检查和标记“sharedSocket.loadedHander”的代码来运行它,但如果我这样做,所有事件将运行两次,如果我转到 NextViewController 并再次返回 ViewController,则所有事件将运行三次。

我尝试对这个问题进行了大量研究,但找不到任何解决方案。如果您以前使用过 Swift 或 Objective-C 和 Socket.io 库并解决了这个问题,请帮助我。

非常感谢您的阅读!

最佳答案

在执行到下一个 ViewController 的 segue 之前尝试断开与第一个 ViewController 的连接。然后,在第二个 ViewController 中重新连接。

此外,您可能需要全局声明socket 常量。

关于ios - Swift 和 Socket.io : Event doesn't run anymore when re-open a controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30317127/

相关文章:

iphone - 删除 "Capture Video"按钮并为弹出 Controller 外部的按钮提供相同的功能

javascript - 如何从 AWS Lambda node.js 异步函数返回数据?

ios - 1 :1 width:height constraint to UIButton programmatically

iphone - 如何在 iPhone App 的不同文件中为 UIAlertview 设置委托(delegate)

ios - UIPickerView 未填充

iphone - 委托(delegate)和协议(protocol)无法正常工作

ios - Xcode 5 在我尝试下载身份后立即意外退出

ios - UIBlurEffect 在设备上不模糊但在模拟器中有效

node.js - 我应该如何排除 electron-packager 中的所有 node_modules

node.js - 如何在没有管理员权限的情况下安装 Node 版本管理器(NVM)