RxSwift 사용해서 환율 앱 ViewController 구성해보쟝

hyun·2025년 7월 10일
0

iOS

목록 보기
29/54

RxSwift를 활용해서 UISearchBar 입력을 reactive하게 처리하고 ViewModel이랑 연동해봄

ExchangeRateViewController에서 UISearchBar의 텍스트 입력 이벤트를 RxSwift 스트림으로 변환하고 뷰모델의 search(query:) 메서드로 전달해서 검색 기능을 구현했다.

searchBar.rx.text.orEmpty
→ UISearchBar의 text 값을 옵셔널 없이 스트림으로 바인딩함

.debounce(.milliseconds(300), scheduler: MainScheduler.instance)
→ 사용자가 입력을 멈춘 후 300ms가 지나고 다음 이벤트를 방출하도록 해서 과도한 API 호출이나 계산을 방지함

.distinctUntilChanged()
→ 동일한 문자열이 연속해서 입력되면 무시하도록 함

.subscribe(onNext:)
→ query가 변경될 때마다 ViewModel의 search(query:) 메서드를 호출해서 필터링 로직 실행

.disposed(by: disposeBag)
→ 구독 해제를 책임지는 disposeBag 사용

 코드

private func bindSearchBar() {
    searchBar.rx.text.orEmpty
        .debounce(.milliseconds(300), scheduler: MainScheduler.instance)
        .distinctUntilChanged()
        .subscribe(onNext: { [weak self] query in
            self?.viewModel.search(query: query)
        })
        .disposed(by: disposeBag)
}

사용자의 검색 입력은 RxSwift 스트림으로 처리, ViewModel을 통해서 filteredItems를 업데이트하고 다시 ViewController는 onUpdate 콜백으로 UI를 갱신하는 구조

bindSearchBar() 함수는 선언만 되어 있고 viewDidLoad()에서 호출되지 않아서 실제 동작하게 하려면 viewDidLoad() 안에서 호출해야 함

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.title = "환율 정보"
    setupUI()
    bindViewModel()
    bindSearchBar() // 여기
    viewModel.fetchRates()
}

0개의 댓글