繁体   English   中英

如何在Web套接字中制作Singles Manager类的Starscream

[英]How to make a Singleton Manager Class of Starscream in Web-socket

我如何才能迅速使starcream Web套接字的单个班级经理。 请帮助我,仅通过管理Singleton类管理器即可如何获得请求和响应。

因为我想在应用程序中的许多视图和子视图中使用套接字,所以我不能在每个类上初始化委托方法并获取请求和响应,这不是一个好习惯。

我要如何使用websockets格式进行身份验证的另一个问题是:

{'UsernameAuth':'Username', 'PasswordAuth':'Password'}

请帮我。

谢谢

Swift中的单调非常琐碎。 创建一个单独的Swift文件:WSHub.swift

集线器应该将消息传递给观察者。

import Srascream

@objc protocol WSHubObserver: class {
    optional func wsHub(_ hub: WSHub, receivedText: String)
    optional func wsHub(_ hub: WSHub, receivedJsonDic: [String: Any])
    optional func wsHub(_ hub: WSHub, receivedJsonArray: [Any])
}

class WSHub: NSObject {
    static let shared = WSHub()
    private(set) var webSocket: WebSocket
    // Note these observers are referenced and instances will not die unless removed from observers or you can wrap them into WeakRef struct
    private var observers: [WSHubObserver] = []

    private init() { 
        self.webSocket = WebSocket(... some URL or URLRequest here...)
        super.init() 
        self.websocket.onText = { [weak self] (text) in 
            self?.handleText(text)
        }
    }

    public func addObserver(_ observer: WSHubObserver) {
        self.observers.append(observer)        
    }

    public func addObserver(_ observer: WSHubObserver) {
        if let index = self.objservers.index(observer) {
            self.observers.remove(at: index)
        }
    }

    private func handleText(_ text: String) {
        self.observers.forEach { observer in
            observer.wsHub?(self, receivedText: text)
        }
        if let data = text.data(using: .utf8),
        let object = try? JSONSerialization.jsonObject(with: data, options: []) {
            if let dic = object as? [String : Any] { 
                observer.wsHub?(self, receivedJsonDic: dic)
            } else if let arr = object as? [Any] { 
                observer.wsHub?(self, receivedJsonArray: arr)
            }
        }
    }
}

然后,您可以在代码WSHub.shared.webSocket.send(...)任何位置使用lazily-initialized单例

授权部分取决于服务器。 它可能是单独的URLRequest到带有https:// url的json数据的POST ,然后您可能会收到标头Set-Cookie响应。 当您要连接到websocket时,可以创建URLRequest并执行request.set(someCookieString, for: "Cookie") ,然后服务器可以让您进入ws管道。

我怀疑您应该在连接的每个tme都发送登录名/密码,因为在应用程序内部存储用户凭据是一种不好的方式,因此您应该基于会话。

然后您的处理程序:

class SomeWsHubSmallClass: NSObject, WSHubObserver {
    func wsHub(_ hub: WSHub, receivedText: String) {
    }
    func wsHub(_ hub: WSHub, receivedJsonDic: [String: Any]) {
    }
    func wsHub(_ hub: WSHub, receivedJsonArray: [Any]) {
    }
}

let object = SomeWsHubSmallClass()
WSHub.shared.addObserver(object)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM