gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 06:57:14 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com