Variante der Arbeit mit Web-Sockets in iOS in Swift / Schrieb einen Manager für die Arbeit mit Web-Socket

Hallo allerseits.

Vor 4 Jahren beschäftigte ich mich bereits mit Web-Sockets in iOS, dann löste ich das Problem mit einer der Cocoapods-Bibliotheken, der Artikel ist auf Habré . Und heute möchte ich eine andere Lösung demonstrieren, die ohne Kokosnüsse auskommt.

Ich habe meinen Manager für die Arbeit mit Web-Sockets geschrieben (der Manager ist in diesem Fall eine Singleton-Klasse, die an einer beliebigen Stelle in der Anwendung aufgerufen werden kann, da diese Singleton-Instanz nur einmal für die gesamte Anwendung erstellt wird).

Ich werde native Mittel für meine Zwecke verwenden.

import Foundation class WSManager { public static let shared = WSManager() //   private init(){} private var dataArray = [__]() let webSocketTask = URLSession(configuration: .default).webSocketTask(with: URL(string: "wss://__"*)) //   public func connectToWebSocket() { webSocketTask.resume() self.receiveData() { _ in } } //     public func subscribeBtcUsd() { let message = URLSessionWebSocketTask.Message.string("SUBSCRIBE: __") webSocketTask.send(message) { error in if let error = error { print("WebSocket couldn't send message because: \(error)") } } } //     public func unSubscribeBtcUsd() { let message = URLSessionWebSocketTask.Message.string("UNSUBSCRIBE: __ ") webSocketTask.send(message) { error in if let error = error { print("WebSocket couldn't send message because: \(error)") } } } //  ,       func receiveData(completion: @escaping ([__]?) -> Void) { webSocketTask.receive { result in switch result { case .failure(let error): print("Error in receiving message: \(error)") case .success(let message): switch message { case .string(let text): let data: Data? = text.data(using: .utf8) let srvData = try? CODABLE_____.decode(from: data ?? Data()) for singleData in srvData ?? [] { self.dataArray.append(__(1: singleData.parametr1, 2: singleData.parametr2, 3: singleData.parametr3)) } case .data(let data): //         print("Received data: \(data)") @unknown default: debugPrint("Unknown message") } self.receiveData() {_ in } //  } } completion(self.dataArray) //          } } 

Hier ist ein solcher Manager ein Beispiel für einen Anruf

 import UIKit class MainViewController: UIViewController { private var dataArray = [__]() override func viewDidLoad() { super.viewDidLoad() WSManager.shared.connectToWebSocket() //  WSManager.shared.subscribeBtcUsd() //    self.getData() //  } private func getData() { //  WSManager.shared.receiveData() { [weak self] (data) in guard let self = self else { return } guard let data = data else { return } self.dataArray = data //              } } } 

* über die Adresse
wss: // Dies ist ein Analogon von https: //
ws: // Dies ist ein Analogon von http: //

Dies ist die Option für die Arbeit mit dem Web-Socket, die sich herausstellte, wenn Sie Fragen, Vorschläge, Unterweisungen zum Verbessern haben, schreiben, würde ich mich freuen :)

Ein Testfall ist in meinem Github verfügbar

Ich verwende auch eine Erweiterung für Decodable, die auch in meinem Github verfügbar ist
Ich spreche über diesen Teil

 let srvData = try? CODABLE_____.decode(from: data ?? Data()) 

Source: https://habr.com/ru/post/de485468/


All Articles