委托函数不在UIViewController之外工作

时间:2017-08-13 12:46:35

标签: ios swift

我正在使用Startscream Websocket框架。只要我将所有代码保存在UIViewController here中,一切正常。但是,只要为Startscream创建一个包装类,所有委派的函数就会停止工作。我的本地websocket服务器也没有连接。

如何让代码在包装类中运行?

MyService.swift:

import Starscream

public class MyService: WebSocketDelegate {
    var socket = WebSocket(url: URL(string: "ws://localhost:3900/websocket")!)

    func connect() {
        socket.delegate = self
        socket.connect()
        print("Connecting")
    }

    // MARK: Websocket Delegate Methods.

    public func websocketDidConnect(socket: WebSocket) {
        print("websocket is connected")
    }

    public func websocketDidDisconnect(socket: WebSocket, error: NSError?) {
        if let e = error {
            print("websocket is disconnected: \(e.localizedDescription)")
        } else {
            print("websocket disconnected")
        }
    }

    public func websocketDidReceiveMessage(socket: WebSocket, text: String) {
        print("Received text: \(text)")
    }

    public func websocketDidReceiveData(socket: WebSocket, data: Data) {
        print("Received data: \(data.count)")
    }

    // MARK: Write Text Action

    @IBAction func writeText(_ sender: UIBarButtonItem) {
        socket.write(string: "hello there!")
    }

    // MARK: Disconnect Action

    @IBAction func disconnect(_ sender: UIBarButtonItem) {
        if socket.isConnected {
            sender.title = "Connect"
            socket.disconnect()
        } else {
            sender.title = "Disconnect"
            socket.connect()
        }
    }

}

ViewController.swift:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let service = MyService()
        service.connect()
    }

}

2 个答案:

答案 0 :(得分:2)

The reference to Service in ViewController was not stored anywhere so as soon as the function was run it was cleaned up. This is how I fixed it:

class ViewController: UIViewController {

    var service = MyService()

    override func viewDidLoad() {
        super.viewDidLoad()
        service.connect()
    }

    ...

答案 1 :(得分:0)

我不确定您的代码有什么问题,它可能是端点问题,或者WS不是以某种方式分配的。我和使用Swift 3的Starscream有相同的代码,这是我班级的主要部分。

class ConnectionManager {
    private var savedSocket: WebSocket?
    fileprivate var socket: WebSocket {

        if let saved = savedSocket {
            return saved
        }

        let wsURL = URL(string: UserDefaultsManager.wsURLString)!

        savedSocket = WebSocket(url: wsURL)

        return savedSocket!
    }

    func startSession() {

        if (socket.isConnected) { return }
        socket.headers = headers
        socket.delegate = self

        socket.connect()
    }

    func endSession() {

        if (socket.isConnected) {
            socket.disconnect()
        }

    }
}

extension ConnectionManager: WebSocketDelegate {
    func websocketDidConnect(socket: WebSocket) {

    }

    func websocketDidDisconnect(socket: WebSocket, error: NSError?){
        if let e = error {
            log.error("websocket is disconnected with ERROR: \(e.localizedDescription)")
        } else {
            log.error("websocket disconnected")
        }

    }

    func websocketDidReceiveMessage(socket: WebSocket, text: String){

    }

    func websocketDidReceiveData(socket: WebSocket, data: Data){

    }
}

我的代码肯定不是最佳做法,但它没有任何问题。尝试使用我的版本,也许它会适合你。