ios - Lazy vs init 用于 swift 中的单例设计

标签 ios swift socket.io

我正在使用 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,否则它会崩溃。我找到了两个可以解决这个问题的方案

  1. 懒惰

    lazy var socket = SocketIOClient(socketURL: URL(string: mainURL)!, config: [.log(false), .compress, .connectParams(["token": "asdasdasdsa"])])
    

通过使用此方法,socket 将永远不会为 nil,因为它将始终被初始化。但这种方法的问题是,如果创建 SocketIOClient 的成本不低,那么它会是一种很好的使用方法。

  1. 初始化()

    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/

相关文章:

swift - `enablesMarqueeWhenAncestorFocused` 是做什么的?

javascript - Socket.io-客户端连接错误: websocket error

nginx - 带有 nginx 的 Socket.io

xcode - 有没有更好的方法来处理 Swift 的嵌套 "if let" "pyramid of doom?"

swift - 在方法中使用类作为泛型类型参数

javascript - 仅向模型所有者广播消息

ios - IOS中的Unity3d游戏切换到第二个场景后崩溃?

ios - 如何使用 Storyboard在 ios 的 Root View 中显示某些内容?

ios - "CoreData does not support persistent cross-store relationships"尽管匹配 x-coredata id

iphone - 释放对象时内存不会减少