Varian bekerja dengan soket web di iOS di Swift / Menulis manajer untuk bekerja dengan websocket

Halo semuanya.

4 tahun yang lalu saya sudah berurusan dengan soket web di iOS, kemudian saya memecahkan masalah menggunakan salah satu perpustakaan cocoapods, artikelnya ada di Habré . Dan hari ini saya ingin menunjukkan solusi lain, yang asli tanpa cocoapods.

Saya menulis manajer saya untuk bekerja dengan soket web (Manajer dalam hal ini adalah kelas tunggal yang dapat dipanggil di mana saja dalam aplikasi, karena instance tunggal ini hanya akan dibuat sekali untuk seluruh aplikasi).

Saya akan menggunakan cara asli untuk tujuan saya.

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

Berikut adalah manajer seperti itu, contoh dari panggilan

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

* tentang alamat
wss: // ini adalah analog dari https: //
ws: // ini adalah analog dari http: //

Ini adalah opsi untuk bekerja dengan soket web yang ternyata, jika Anda memiliki pertanyaan, saran, pengajaran tentang bagaimana melakukan yang lebih baik, menulis, saya akan senang :)

Kasing uji tersedia di github saya

Saya juga menggunakan ekstensi untuk Decodable yang juga tersedia di github saya
Saya berbicara tentang bagian ini

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

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


All Articles