IOS Swift Web Socket SRWebSocket устанавливает время ожидания ответа

Я использую в своем приложении библиотеку SRWebSocket / SocketRocket. Я не могу установить для нее тайм-аут ответа. Я хочу показать сообщение, если сокет не получает данные через несколько секунд

Ниже мой код

socketRocket = SRWebSocket(url: URL(string: streamUrl)!)
socketRocket?.delegate = self
socketRocket?.open()

Также используются следующие методы обратного вызова

func webSocketDidOpen(_ webSocket: SRWebSocket!) {
    print("webSocketDidOpen")
    showTableView()
}

func webSocket(_ webSocket: SRWebSocket!, didCloseWithCode code: Int, reason: String!, wasClean: Bool) {
    getConversationId()
}

func webSocket(_ webSocket: SRWebSocket!, didFailWithError error: Error!) {
    print("didFailWithError\(error)")
    showLErrorView()
}

func webSocket(_ webSocket: SRWebSocket!, didReceiveMessage message: Any!) {
}

вот ссылка на библиотеку

https://github.com/facebook/SocketRocket


person amodkanthe    schedule 06.11.2019    source источник
comment
Можете ли вы добавить ссылку на библиотеку веб-сокетов, которую вы используете?   -  person Awad    schedule 13.11.2019
comment
разве эти методы делегирования не работают?   -  person Zeeshan Ahmed    schedule 13.11.2019
comment
обновлен вопрос, добавлена ​​ссылка на библиотеку   -  person amodkanthe    schedule 13.11.2019
comment
Привет, @amodkanthe, я думаю, вам следует создать объект Executer, который может выполнять определенные задания через заданное время в секунду с помощью Timer. Затем вы можете просто запустить таймер и дать задание Executer в случае запроса.   -  person emrcftci    schedule 14.11.2019
comment
@amodkanthe Я не вижу способа установить тайм-аут на соединениях с веб-сокетами. Я знаю, что это не ответ на ваш вопрос, но просматривали ли вы библиотеку github.com/daltoniam/starscream . Я использовал его, и у него есть простой способ установить socket.disconnect(forceTimeout: 10, closeCode: CloseCode.normal.rawValue)   -  person Awad    schedule 15.11.2019


Ответы (1)


Если вы хотите отображать какое-либо сообщение, когда вы не получаете ответа, вы можете использовать Timer, в общих чертах это выглядит так:

var timer: Timer?
var responseTimeout: TimeInterval = 15

func startTimer() {
    timer?.invalidate()
    timer = Timer.scheduledTimer(withTimeInterval: responseTimeout, repeats: false, block: {[weak self] timer in
        self?.onResponseTimeout()
    })
}

func onResponseTimeout() {
    print("Didn't get response")
}

func webSocket(_ webSocket: SRWebSocket!, didReceiveMessage message: Any!) {
    print(message)
    timer?.invalidate() //invalidate timer when you get a message
}

а затем вы можете вызвать startTimer(), когда это необходимо, т.е. когда сокет открыт:

func webSocketDidOpen(_ webSocket: SRWebSocket!) {
    print("webSocketDidOpen")
    showTableView()
    startTimer()
}

или после отправки сообщения:

socketRocket?.send(message)
startTimer()

Если вы также хотите установить тайм-аут для соединения (это нечто отдельное от таймаута resopone), вы можете использовать URLRequest вместо URL:

let request = URLRequest(url: url, timeoutInterval: 30) //it is 30 sec connection timeout

socketRocket = SRWebSocket(urlRequest: request)
socketRocket?.delegate = self
socketRocket?.open()

Полный класс, поддерживающий тайм-аут соединения и ответа:

import Foundation
import SocketRocket

class WebSocket: NSObject, SRWebSocketDelegate {

    var socketRocket: SRWebSocket?
    var timer: Timer?

    var responseTimeout: TimeInterval = 15

    func open(url: URL, connectionTimeout: TimeInterval = 10) {
        let request = URLRequest(url: url, timeoutInterval: connectionTimeout)
        socketRocket = SRWebSocket(urlRequest: request)
        socketRocket?.delegate = self
        socketRocket?.open()
    }

    func send(message: String) {
        socketRocket?.send(message)
        startTimer()
    }

    func startTimer() {
        timer?.invalidate()
        timer = Timer.scheduledTimer(withTimeInterval: responseTimeout, repeats: false, block: {[weak self] timer in
            self?.onResponseTimeout()
        })
    }

    func onResponseTimeout() {
        print("Didn't get response")
    }

    func webSocketDidOpen(_ webSocket: SRWebSocket!) {
        print("webSocketDidOpen")
        startTimer()
    }

    func webSocket(_ webSocket: SRWebSocket!, didCloseWithCode code: Int, reason: String!, wasClean: Bool) {
        print("closed with code: \(code), reason: \(reason), wasClean: \(wasClean)")
        timer?.invalidate()
    }

    func webSocket(_ webSocket: SRWebSocket!, didFailWithError error: Error!) {
        print("didFailWithError\(error)")
        timer?.invalidate()
    }

    func webSocket(_ webSocket: SRWebSocket!, didReceiveMessage message: Any!) {
        print(message)
        timer?.invalidate()
    }
}
person Maciej Gad    schedule 15.11.2019