[swift] RxCocoa를 활용한 라이브 채팅 처리 방법

라이브 채팅은 실시간으로 메시지를 주고받을 수 있는 기능을 말합니다. 이번 글에서는 RxCocoa를 사용하여 iOS 앱에서 라이브 채팅을 처리하는 방법을 알아보겠습니다.

필요한 패키지 설치

RxCocoa는 RxSwift와 함께 사용되는 패키지로, 먼저 프로젝트에 RxSwift와 RxCocoa를 설치해야 합니다. Cocoapods를 사용한다면, Podfile에 다음과 같이 추가해주세요.

pod 'RxSwift'
pod 'RxCocoa'

그리고 터미널에서 pod install 명령어를 실행하여 패키지를 설치해줍니다.

라이브 채팅 구현

라이브 채팅을 구현하기 위해서는 주고받는 메시지를 처리하는 기능이 필요합니다. 이를 위해 실시간으로 메시지를 주고받기 위한 프로토콜을 작성해보겠습니다.

protocol LiveChatService {
    func send(message: String)
    func receive() -> Observable<String>
}

위의 프로토콜은 send(message:) 메서드로 메시지를 전송하고, receive() 메서드로 메시지를 수신하는 기능을 정의합니다. 이제 이 프로토콜을 구현하여 RxCocoa를 이용해 라이브 채팅을 처리하는 클래스를 생성해보겠습니다.

import RxSwift
import RxCocoa

class LiveChatServiceImpl: LiveChatService {

    private let disposeBag = DisposeBag()
    private let messageSubject = PublishSubject<String>()

    func send(message: String) {
        messageSubject.onNext(message)
    }
    
    func receive() -> Observable<String> {
        return messageSubject.asObservable()
    }
}

LiveChatServiceImpl 클래스는 LiveChatService 프로토콜을 따르며, messageSubject 객체를 통해 메시지를 주고받습니다. send(message:) 메서드를 호출하면 messageSubjectonNext 이벤트를 통해 메시지를 전송하고, receive() 메서드는 messageSubject를 Observable로 변환하여 메시지를 수신합니다.

뷰 컨트롤러에서 활용하기

이제 위에서 생성한 LiveChatService를 뷰 컨트롤러에서 활용해보겠습니다. 예를 들어, 사용자가 입력한 메시지를 전송 버튼을 통해 전송하고, 받은 메시지를 텍스트 레이블에 표시하는 기능을 구현해보겠습니다.

import RxSwift
import RxCocoa

class ChatViewController: UIViewController {

    @IBOutlet private weak var messageTextField: UITextField!
    @IBOutlet private weak var sendButton: UIButton!
    @IBOutlet private weak var messageLabel: UILabel!
    
    private let liveChatService: LiveChatService = LiveChatServiceImpl()
    private let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        sendButton.rx.tap
            .withLatestFrom(messageTextField.rx.text.orEmpty)
            .bind(onNext: { [weak self] message in
                self?.liveChatService.send(message: message)
            })
            .disposed(by: disposeBag)

        liveChatService.receive()
            .bind(to: messageLabel.rx.text)
            .disposed(by: disposeBag)
    }
}

위의 코드에서는 sendButton.rx.tap을 통해 사용자가 전송 버튼을 탭하면 messageTextField의 텍스트를 가져온 후, liveChatServicesend(message:) 메서드를 호출하여 메시지를 전송합니다.

또한, liveChatService.receive()를 통해 수신한 메시지를 messageLabel의 텍스트에 바인딩하여 표시하는 것을 볼 수 있습니다.

이제 iOS 앱에서 RxCocoa를 활용하여 라이브 채팅을 처리하는 방법을 알아보았습니다. RxCocoa를 사용하면 비동기적인 메시지 처리를 간편하게 구현할 수 있으며, 더 나아가 더 복잡한 채팅 기능을 구현할 수도 있습니다.