【发布时间】:2018-04-29 22:15:30
【问题描述】:
我正在使用 socket.io 来使用实时机制。我现在面临的问题是加载 viewController 后创建的 Socket.io 对象
我正在使用单例设计
import SocketIO
class SocketIOManager: NSObject {
static let sharedInstance = SocketIOManager()
var socket: SocketIOClient!
func establishConnection() {
socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])])
socket.connect()
}
func closeConnection() {
socket.disconnect()
}
}
无论如何,我都需要在建立连接中设置套接字,以确保用户已与令牌一起建立与服务器的连接。如果我按照弗拉德的回答,将永远不会建立连接,因为令牌事先是空的,因此用户将无法连接。
用户登录
func logIn() {
// Getting it from alamofire
keychain["token"] = token
//then only establish connection
SocketIOManager.sharedInstance.establishConnection()
}
如果我使用 Init 方法,那么 socket 将为零,因为在 applicationDidBecomeActive 中有 SocketIOManager.sharedInstance.establishConnection(),所以逻辑是每当用户加载应用程序时,applicationDidBecomeActive 就会运行
所以从技术上讲,我使用 sharedInstance 来运行 socket.io 对象。
func applicationDidBecomeActive(_ application: UIApplication) {
SocketIOManager.sharedInstance.establishConnection()
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
现在 didBecomeActive 中的套接字对象在视图加载后运行
override func viewDidLoad() {
super.viewDidLoad()
listeningOnMerchant()
}
func listeningOnMerchant() {
// I got error around here
SocketIOManager.sharedInstance.socket.on("listening") { ack, data in
print("something")
}
}
}
这会崩溃,因为socket 为零。如何使 viewController 不崩溃。我可以使用let 方法来阻止崩溃
if let socket = SocketIOManager.sharedInstance.socket {
}
但如果我使用socket 并且套接字将不会运行,它将为零。如何不让socket不崩溃?
因为我真的需要将socket.connect 放在applicationDidBecomeActive 上以使其与连接与didLaunch 一致
谢谢!
【问题讨论】:
-
如果你已经在使用单例,为什么不把套接字的初始化放在这个单例中呢?
-
由于特定原因,初始化只能在
establishConnection函数中调用。 -
我已经编辑了我的问题
-
不确定我是否直接理解了这个问题,但是为什么你不能在尝试调用
.on之前初始化套接字,如果它是nil