[RxSwift] AirPortClone: Search & Filter

Junyoung Park·2022년 12월 23일
0

RxSwift

목록 보기
16/25
post-thumbnail
post-custom-banner

#4 RxSwift Search and Filter a DataSource for a TableView - RxSwift MVVM Coordinator iOS App

AirPortClone: Search & Filter

구현 목표

  • 검색 쿼리문을 통한 옵저버블 데이터 검색

구현 태스크

  • API를 통해 패치받은 데이터의 집합화
  • 검색 쿼리문과 실시간 연동
  • 관찰 가능하도록 asObservable
  • 해당 옵저버블 데이터를 결합한 뒤 데이터 필터링

핵심 코드

    private let disposeBag = DisposeBag()
    typealias State = (airports: BehaviorRelay<Set<AirportModel>>, ())
    private let state: State = (airports: BehaviorRelay(value: []), ())
  • 뷰 모델이 가지고 있는 상태 변수 state를 통해 현 시점에서 가지고 있는 공항 데이터 표현
func process() {
        airportService
            .fetchAirports()
            .map({ Set($0) })
            .map({ [state] in state.airports.accept($0) })
            .subscribe()
            .disposed(by: disposeBag)
    }
  • API를 통해 받아온 데이터를 집합으로 만든 뒤 BehaviorRelay에 포함시키기
    static func transform(input: SearchViewPresentable.Input, state: State, bag: DisposeBag) -> SearchViewPresentable.Output {
        let searchTextObservable = input.searchText
            .debounce(.milliseconds(500))
            .distinctUntilChanged()
            .skip(1)
            .asObservable()
            .share(replay: 1, scope: .whileConnected)
        let airportsObservable = state.airports
            .skip(1)
            .asObservable()
        
        Observable
            .combineLatest(searchTextObservable, airportsObservable)
            .map { query, airports in
                return airports.filter { airport -> Bool in
                    !query.isEmpty && airport.city.lowercased().replacingOccurrences(of: " ", with: "")
                        .hasPrefix(query.lowercased())
                }
            }
            .subscribe()
            .disposed(by: bag)
        
        return ()
    }
  • 인풋-아웃풋 변환을 해줄 때 파라미터로 들어온 쿼리 텍스트 문과 가지고 있는 전체 데이터를 연결
  • Observable이 가지고 있는 combineLatest를 통해 검색 쿼리문 관찰자 + 공항 데이터 관찰자를 동시에 체크 가능
profile
JUST DO IT
post-custom-banner

0개의 댓글