我正在使用 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()
}
}
所以从技术上讲,每当我的应用程序加载时,socket
都不能为 nil,否则它会崩溃。我找到了两个可以解决这个问题的方案
懒惰
lazy var socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])])
通过使用此方法,socket
将永远不会为 nil,因为它将始终被初始化。但这种方法的问题是,如果创建 SocketIOClient 的成本不低,那么它会是一种很好的使用方法。
初始化()
class SocketIOManager: NSObject { static let sharedInstance = SocketIOManager() let socket: SocketIOClient! init() { super.init() socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])]) } }
通过使用这种方法,我有点困惑,因为我最初并没有像这样创建 SocketIOManager 对象
let socket = SocketIOManager()
因为如果我没记错的话,如果只创建对象,套接字将被初始化,而且我不确定在单例设计中使用 init()
哪种方法适合我的用例?
最佳答案
在 Swift 全局变量中,包括类的静态成员默认是惰性所以这是正确的:
class SocketIOManager: NSObject {
static let sharedInstance = SocketIOManager()
let socket: SocketIOClient!
private override init() {
super.init()
socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])])
}
}
注意 init 上的 private 以防止任何其他人尝试实例化此类,因为它是一个单例。
关于ios - Lazy vs init 用于 swift 中的单例设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47363566/