Если вы хотите отображать какое-либо сообщение, когда вы не получаете ответа, вы можете использовать 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
Executer
, который может выполнять определенные задания через заданное время в секунду с помощьюTimer
. Затем вы можете просто запустить таймер и дать заданиеExecuter
в случае запроса. - person emrcftci   schedule 14.11.2019socket.disconnect(forceTimeout: 10, closeCode: CloseCode.normal.rawValue)
- person Awad   schedule 15.11.2019