Skip to content

검색  #5

@zzangzzangguy

Description

@zzangzzangguy

SearchViewController.swift

  1. 사용자 입력 처리 및 API 호출 트리거
searchController.searchBar.rx.searchButtonClicked
   .withLatestFrom(searchController.searchBar.rx.text.orEmpty)
   .filter { !$0.isEmpty }
   .map { Reactor.Action.search($0) }
   .bind(to: reactor.action)
   .disposed(by: disposeBag)
  • 검색 버튼 탭 이벤트 감지
  • 검색어 텍스트와 결합하여 빈 문자열 필터링
  • ReactorKit의 search 액션으로 변환하여 Reactor로 전달
  1. 검색 액션에 대한 비즈니스 로직 처리
case .search(let query):
    guard !currentState.isLoading else { return Observable.empty() }
    let request = CardsRequest(query: query, page: 1)
    return Observable.concat([
        Observable.just(Mutation.setLoading(true)),
        self.pokemonRepository.fetchCards(request: request)
            .map { result in Mutation.setSearchResults(result) }
            .catchError { Observable.just(Mutation.setError($0)) },
        Observable.just(Mutation.setLoading(false))
    ])

중복 요청 방지를 위한 로딩 상태 검사
검색어와 페이지 정보를 포함한 CardsRequest 생성
pokemonRepository를 통해 API 호출 수행
검색 결과를 setSearchResults 뮤테이션으로 상태 업데이트
에러 발생 시 setError 뮤테이션으로 상태 업데이트
로딩 상태 관리를 위한 setLoading 뮤테이션 사용

  1. 검색 결과 표시 및 상태 변화 구독
reactor.state.map { $0.searchResult }
    .distinctUntilChanged()
    .bind(to: tableView.rx.items(cellIdentifier: "PokemonCardTableViewCell", cellType: PokemonCardTableViewCell.self)) { _, item, cell in
        cell.configure(with: item)
    }
    .disposed(by: disposeBag)

Reactor의 상태에서 searchResult 추출
중복 이벤트 제거를 위해 distinctUntilChanged 연산자 사용
테이블 뷰의 items 속성에 바인딩하여 검색 결과 표시
셀 구성을 위한 configure 메서드 호출

  • 역할: 검색 화면의 UI를 구성하고 사용자 인터랙션을 처리하는 뷰 컨트롤러입니다.
  • 주요 기능:
    • 검색어 입력을 받아 SearchReactor로 전달합니다.
    • 검색 결과를 테이블 뷰로 표시합니다.
    • 무한 스크롤을 통해 추가 검색 결과를 로드합니다.
    • 필터 옵션을 선택하여 검색 결과를 필터링합니다.
  • 데이터 흐름:
    • 사용자가 검색어를 입력하면 updateSearchQuery 액션을 통해 SearchReactor로 전달됩니다.
    • 검색 버튼을 탭하면 search 액션을 통해 SearchReactor에 검색을 요청합니다.
    • SearchReactor로부터 받은 상태 변화를 구독하여 UI를 업데이트합니다.

2. SearchReactor.swift

  • 역할: 검색 화면의 비즈니스 로직을 담당하는 리액터입니다.
  • 주요 기능:
    • 검색어 업데이트 및 검색 수행
    • 검색 결과 상태 관리
    • 무한 스크롤 처리
    • 필터 옵션 적용
  • 데이터 흐름:
    • updateSearchQuery 액션을 받아 현재 검색어를 업데이트합니다.
    • search 액션을 받아 PokemonRepository를 통해 API 호출을 수행.
    • 검색 결과를 상태에 저장하고 뷰로 전달.
    • 무한 스크롤 액션을 받아 추가 검색 결과를 로드.
    • 필터 옵션 선택 시 해당 옵션을 적용하여 검색 결과를 필터링.

3. PokemonRepository.swift

  • 역할: 포켓몬 데이터를 가져오기 위한 리포지토리입니다.
  • 주요 기능:
    • 포켓몬 카드 검색 API 호출
  • 데이터 흐름:
    • SearchReactor로부터 검색 요청을 받아 PokemonTarget을 통해 API 호출을 수행.
    • API 응답 데이터를 가공하여 SearchReactor로 전달.

5. CardsRequest.swift

  • 역할: 포켓몬 카드 검색 요청 파라미터를 캡슐화하는 구조체입니다.
  • 주요 기능:
    • 검색어, 페이지, 페이지 크기 등의 요청 파라미터를 저장합니다.
    • 요청 파라미터를 딕셔너리 형태로 변환하는 기능을 제공합니다.
  • 데이터 흐름:
    • PokemonRepository에서 CardsRequest를 사용하여 요청 파라미터를 설정합니다.

데이터 흐름 정리

  1. 사용자 입력(SearchViewController)
  2. 액션 전달(SearchReactor)
  3. API 호출(PokemonRepository)
  4. 응답 데이터 가공(PokemonRepository)
  5. 상태 업데이트(SearchReactor)
  6. UI 업데이트(SearchViewController)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions