-
[뉴스어플 정리] 4. 뉴스데이터를 뷰모델로 가공하기iOS/뉴스어플(RxSwift) 2021. 5. 24. 21:52
뷰모델 리스트 클래스를 만들었다.
이 글 전체를 요약하면 다운받은 [Article]을 [ViewModel]로 바꿔주는 것이다.
이 역할을 뷰모델 리스트 클래스가 해준다.
import Foundation import RxSwift class NewsTableViewCellViewModelList { var articleObservable = BehaviorSubject<[NewsTableViewCellViewModel]>(value: []) let disposeBag = DisposeBag() init() { fetchViewModel(source: APICaller.Source.us) } func fetchViewModel(source: URL?) { APICaller.getNewsData(source: source) .map { $0.map { return NewsTableViewCellViewModel( newsTitle: $0.title, subTitle: $0.description, urlToNews: $0.url, urlToImage: $0.urlToImage) } }.subscribe (onNext: { [weak self] in self?.articleObservable.onNext($0) }).disposed(by: disposeBag) } }articleObservable이라는 이름의 BehaviorSubject를 만든다.
이거의 역할은 [ViewModel]을 onNext로 보내는 것이다.
fetchViewModel이라는 함수가 [Article]을 [ViewModel]로 바꿔주는 역할을 한다.
이전글에서 APICaller.getNewsData는 Observable<[Article]>을 return 했었다.
Observable<[Article]>.map의 $0은 [Articles]이고 $0.map의 $0은 article이다.
이 마지막 $0인 article을 viewModel로 바꿔주는 코드를 만든다.
그 코드는 그냥 $0의 title, description, url, urlToImage로 초기화된 ViewModel을 return하는 것이다.
그럼 Observable<[ViewModel]>이 만들어진다.
이거를 subscribe하면 [ViewModel]을 얻을 수 있다.
그 뷰모델을 articleObservable의 onNext로 보내면
이 articleObservable에 bind되어 있는 값들이 바뀐다.
이제 ViewModelList 클래스를 만들고
테이블뷰에 articleObservable을 bind하면
articleObservable이 onNext할때마다
bind되어있는 테이블뷰가 변할 것이다.
init() 함수에는 미국뉴스 API를 적었기 때문에 처음 화면은 미국뉴스이다.
Subject를 사용한 이유는 다른 국가의 뉴스를 불러오기 위해서이다.
fetchViewModel의 인자로 들어가는 source에 다른 국가 API 주소를 넣으면
다른 국가의 [Article]이 articleObservable의 onNext로 간다.
그러면 bind되어있는 뷰에서 다른 국가 뉴스로 바뀐다.
만약에 하나의 국가만 사용하면 map의 결과로 나온 observable<[Article]>을 그대로 사용했을 것이다.
'iOS > 뉴스어플(RxSwift)' 카테고리의 다른 글
[뉴스어플 정리] 6. 테이블뷰 셀 터치하기 (0) 2021.05.25 [뉴스어플 정리] 5. 뷰모델을 테이블뷰에 붙이기 (0) 2021.05.24 [뉴스어플 정리] 3. 뷰모델 만들기 (0) 2021.05.24 [뉴스어플 정리] 2. 뉴스데이터 가져오기 (0) 2021.05.24 [뉴스어플 정리] 1. NewsAPI 사용하기, 모델만들기 (0) 2021.05.24