apple/UIKit & ReactiveX
[iOS] starscream 사용법 총정리!
lgvv
2022. 1. 12. 15:09
✅ 이번 시간에는 starscream사용버에 대해서 알아볼 예정이야.
지난 시간에 RxStarscream을 공부했었는데, 궁금하다면 같은 카테고리에 있는 RxStarscream을 봐도 좋아.
starscream이 무엇이냐면 websokcet을 조금 더 편리하게 사용할 수 있게 도와주는 프레임워크라고 생각하면 돼!
✅ starscream github
https://github.com/daltoniam/Starscream
사실 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)
}