[TIL] ViewModel 구현하기

Eden·2025년 1월 2일
3

TIL

목록 보기
85/92
post-thumbnail
import Foundation
import RxSwift
import RxCocoa

class MainViewModel {
    private let networkManager = NetworkManager.shared
    private let disposeBag = DisposeBag()
    
    var pokemonList: BehaviorSubject<[PokemonListItem]> = BehaviorSubject(value: [])
    
    var error: PublishSubject<String> = PublishSubject()
    
    private var limit: Int = 20
    private var offset: Int = 0
    
    func fetchPokemonList() {
        let endpoint = PokemonAPI.fetchPokemonList(limit: limit, offset: offset)
        
        networkManager.fetch(endpoint: endpoint, type: PokemonList.self)
            .subscribe{ [weak self] result in
                switch result {
                case .success(let pokemonListData):
                    self?.pokemonList.onNext(pokemonListData.results)
                case .failure(let error):
                    self?.error.onNext(error.localizedDescription)
                }
            }
            .disposed(by: disposeBag)
    }
}

1. Pokémon 리스트 데이터 관리

  • 이 뷰모델은 Pokémon 리스트 데이터를 서버에서 가져와서 View에게 전달해주는 데이터 관리자 역할을 한다.
  • 데이터를 가져와서 pokemonList라는 Subject에 넣으면, View가 그 데이터를 받아 업데이트할 수 있다.

2. 에러 처리

  • 네트워크 요청이 실패했을 때, 발생한 에러 메시지를 error라는 Subject를 통해 View에게 전달한다.
  • View가 구독하여 사용자에게 에러 메시지를 보여줄 수 있다.

3. API 요청 로직

  • API 호출과 응답 처리를 담당
    • 어떤 API를 호출할지(엔드포인트 생성).
    • 응답 데이터를 받아 pokemonList에 저장.
    • 실패 시 에러 메시지를 error로 전달.
  • View이 네트워크 요청의 복잡한 내용을 몰라도 되도록 ViewModel이 대신 처리해준다.

4. 페이징 관련 설정 관리

  • 리스트를 몇 개씩 가져올지(limit)와 어디서부터 가져올지(offset)을 관리한다.
  • 나중에 다음 페이지 데이터를 가져오고 싶다면 offset 값을 조정하는 메서드를 추가하면 된다.

정리

MainViewModel은 View와 네트워크(API) 사이의 중간다리 역할을 하며, 데이터 요청, 데이터 관리, 에러 처리를 책임지고 있다.

왜 필요할까?

  • 네트워크 요청 로직을 View에서 분리해서 코드가 깔끔해지고, 유지보수하기 쉬워진다.
  • RxSwift를 통해 데이터가 변하면 자동으로 화면이 업데이트되도록 만들어 반응형 프로그래밍을 구현할 수 있따.
profile
Frontend🌐 and iOS

0개의 댓글