apple/UIKit & ReactiveX

[iOS] starscream 사용법 총정리!

lgvv 2022. 1. 12. 15:09

✅ 이번 시간에는 starscream사용버에 대해서 알아볼 예정이야.

 

지난 시간에 RxStarscream을 공부했었는데, 궁금하다면 같은 카테고리에 있는 RxStarscream을 봐도 좋아.

 

starscream이 무엇이냐면 websokcet을 조금 더 편리하게 사용할 수 있게 도와주는 프레임워크라고 생각하면 돼!

 

✅ starscream github

https://github.com/daltoniam/Starscream

 

GitHub - daltoniam/Starscream: Websockets in swift for iOS and OSX

Websockets in swift for iOS and OSX. Contribute to daltoniam/Starscream development by creating an account on GitHub.

github.com

 

 

사실 starscream과 rxStarscream은 크게 차이가 있지는 않아서, 쓱 보면 쓱 이해할 수 있을거야

 

🟠 WebSocketManager.swift

import Foundation

import RxSwift
import RxCocoa
import Starscream

class WebSocketManager {
    
    static let shared = WebSocketManager() // 싱글톤으로 사용하기 위함.
    
    private var webSocket: WebSocket!
    
    var responseSubject = PublishSubject<String>()
    var responseString = ""
    
    // 1. ViewController에서 매니저를 싱글톤으로 활용하여 connect를 먼저 호출
    func connect() {
        print("connect function")
        let url = "{YOUR SERVER}"
        var request = URLRequest(url: URL(string: url)!)
        request.addValue("{YOUR SERVER}", forHTTPHeaderField: "Origin") // HTTPUpgare error이 나타나면 넣어주세요
        request.timeoutInterval = 10
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        
        webSocket = WebSocket(request: request)
        webSocket.delegate = self 
        webSocket.connect()
    }
    
    // 2. ViewController에서 매니저를 싱글톤으로 request 호출
    func request(from keyword: String) {
        if webSocket != nil {
            webSocket.write(string: keyword) // 2-1. write로 서버에 요청(데이터 전달)
        } else {
            print("webSocket is not connected")
        }
    }
    
    func disconnect() {
        if webSocket != nil {
            webSocket.disconnect()
        } else {
            print("webSocket is not connected")
        }
    }
}

extension WebSocketManager: WebSocketDelegate {
    func websocketDidConnect(socket: WebSocketClient) {
        print("connected") // 1-1. connect 성공시 
    }
    
    func websocketDidDisconnect(socket: WebSocketClient, error: Error?) {
        print("disconnected")
    }
    
    // 3. 성공시 여기로 데이터가 넘어옴
    func websocketDidReceiveMessage(socket: WebSocketClient, text: String) {
        responseSubject.onNext(text) // 3-1. rx를 사용한다면 이렇게 넘기기
        responseString = text // 3-2. rx를 사용하지 않는다면 이렇게 넘기기
        // TODO: 여기서 Decoding하면 좋습니다.
    }
    
    func websocketDidReceiveData(socket: WebSocketClient, data: Data) {
        print("data: \(data)")
    }
}

기존에 rx.response로 처리하던 것을 delegate가 생기면서 조금 더 긴 함수로 처리한다는 가정이야.

 

그렇다면 ViewController에서는 bind해서 사용하면 되겠지?

class ViewController: UIViewController {
	// ... 생략
    var bag = DisposedBag()
    
	WebSocketManager.shared.responseSubject
    	.bind(to: MyLabel.rx.text)
        .disposed(by: bag)
}