Variante de trabalhar com soquetes da Web no iOS no Swift / Escreveu um gerente para trabalhar com o websocket

Olá pessoal.

Há 4 anos, eu já estava lidando com soquetes da web no iOS, então resolvi o problema usando uma das bibliotecas de cocoapods, o artigo é sobre Habré . E hoje eu quero demonstrar outra solução, nativa sem cocoapods.

Escrevi ao meu gerente para trabalhar com soquetes da web (neste caso, o gerente é uma classe singleton que pode ser chamada em qualquer lugar do aplicativo, pois essa instância singleton será criada apenas uma vez para o aplicativo inteiro).

Usarei meios nativos para meus propósitos.

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) //          } } 

Aqui está um gerente, um exemplo de chamada

 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 //              } } } 

* sobre o endereço
wss: // este é um análogo de https: //
ws: // este é um análogo do http: //

Esta é a opção para trabalhar com o soquete da web que acabou, se você tiver dúvidas, sugestões, ensinamentos sobre como fazer melhor, escrever, ficarei feliz :)

Um caso de teste está disponível no meu github

Eu também uso a extensão para Decodable, que também está disponível no meu github
Eu estou falando sobre essa parte

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

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


All Articles