swift - 在 swift 4 中使用 SocketIO 时丢失对变量的引用

标签 swift socket.io

我是 Swift 的新手,在为 iOS 开发时总是有点乱,所以请多多包涵。

所以在我的 AppDelegate 中我有一个这样的变量

var manager = Manager()

在 didFinishLaunchingWithOptions 中我有

let controller = ChatRoomViewController()
self.manager.delegate = controller
self.manager.setup()
self.manager.attemptToIdentify(user:username);

在我的管理器中

var connectionManager = SocketManager(socketURL: URL(string: "http://0.0.0.0:8080")!)
var usersName = ""
var socket:SocketIOClient! 
func setup(){
    connectionManager.reconnects = true
    socket = connectionManager.defaultSocket;
    self.setSocketEvents();

    socket.connect();
}

这有效,我能够打开一个套接字,在 node.js 服务器上显示用户名。现在,当我从主视图导航到聊天 Controller 并调用

   appDelegate.manager.attemptMessage(msg: message);

控制台告诉我我已断开连接。据我所知,我失去了对我的一个变量的引用。

最佳答案

我认为您不应该在 AppDelegate 中声明您的变量。

我也在我的一个应用程序中使用 Socket.IO,我更喜欢从共享实例类中使用它。不知道大家是否熟悉,这是iOS开发中常见的一种架构。

它基于单例实例,允许您在应用程序的整个生命周期中将变量实例保存在内存中。

对于您的情况,您可以执行以下操作:

private let _managerSharedInstance = Manager()

class Manager() {

    private var connectionManager = SocketManager(socketURL: URL(string: "http://0.0.0.0:8080")!)
    private var usersName = ""
    private var socket:SocketIOClient!

    var delegate: UIViewController?

    class var shared: Manager {
        return _managerSharedInstance
    }

    init() {
        connectionManager.reconnects = true
        socket = connectionManager.defaultSocket;
        setSocketEvents();
        socket.connect();
    }

    private func setSocketEvents() {
        // Your socket events logic
    }

    func attemptToIdentify(user username: String) {
        socket.emit("identify", ["username": username])
    }

    func attemptToSend(message: String) {
        socket.emit("message", ["username": username, "message": message])
    }

}

因此,在您的 AppDelegate.didFinishLaunchingWithOptions 中,您现在可以调用:

Manager.shared.attemptToIdentify(user: username)

您可以在代码的任何地方调用它,shared 类变量将返回 _managerSharedInstance 的实例。

顺便说一句,您应该在该 Controller 的 viewWillAppear 中设置您的 Controller 委托(delegate),而不是在 AppDelegate 中。

func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    Manager.shared.delegate = self
}

关于swift - 在 swift 4 中使用 SocketIO 时丢失对变量的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52886171/

相关文章:

xcode - 在 Swift 中创建自定义 View 时,如何从 drawRect 函数外部在当前上下文之上进行绘制?

ios - Realm 浏览器返回空属性

java - 由 : java. io.IOException 引起:长度 1279873876 超出限制:26

node.js - Docker (compose) 和套接字 io - 如何链接容器

node.js - 套接字错误

node.js - socket.io 不发送给其他用户

swift - 在 Swift 中使用 Wunderground API

ios - 如何计算一个人滚动过的每张图像

swift - 在 Swift 3.0 中,堆栈 View 导致带有图像的按钮离开屏幕

javascript - Node.JS + Socket.io,将套接字事件处理程序移动到外部模块?