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