꾸준히 가야돼! "Rx를 기깔나게 쓰는 신입개발자 도전" 🚀
이번엔, 위의 결과물처럼 네비게이션 상단 우측 바버튼 (list.bullet)을 눌렀을때 OLD/NEW 를 필터링 해서 보여주는 기능을 Rx + MVVM 으로 구현해보았다.
우선, 버튼의 가장 큰 역할인 필터 기능을 해주는 함수를 모델에 구현하였다.
모델에 따로 코드를 빼서 구현한 이유는 데이터모델을 가지고 filter를 하는 기능이기 때문에 ViewModel 보다는 Model이 적합하다고 생각했다.
함수는 버튼이 몇번 눌렸는지에 대한 Int값과 데이터객체인 [BoxOfficeList]를 파라미터로 받고, [BoxOfficeList]를 return 한다.
struct BoxOfficeModel {
func goFilter(type : Int, data : [BoxOfficeList]) -> [BoxOfficeList] {
if type == 0 {
return data
} else {
return data.filter {
$0.rankOldAndNew == "NEW"
}
}
}
}
ViewModel에 다음과 같은 코드를 추가하였다.
let outputData = filterBtnTapped
.map { _ -> Int in
cnt += 1
if cnt % 2 == 1 {
return 1
} else {
return 0
}
}
.startWith(0)
Observable
.combineLatest(outputData, cellData, resultSelector: boxOfficeModel.goFilter)
.bind(to: apiData)
.disposed(by: disposeBag)
PublishRelay<Void>()
로 선언하였다.view의 bind함수 내에서, 다음과 같이 구현할 수 있다.
filterBtn.rx.tap
.bind(to: viewModel.filterBtnTapped)
.disposed(by: disposeBag)
버튼 tap과 viewModel.filterBtnTapped를 바인딩 하였다.
cocoatouch 를 사용한다면, tableView.reloadData()
를 활용한다면 쉽게 구현했을 것 같다.
하지만 rx로 구현했을때의 느껴지는 장점도 있다.
여태껏 coocatouch를 사용해 개발을 해왔기 때문에 rx가 손에 익지 않고 어려움이 있는건 확실하다.
하지만 도전하면 안될건 없다고 생각한다.
구현하고 나면, 코드가 너무 직관적이라서 rx의 매력에 조금씩 빠져드는 것 같다.
무엇보다 rx로 구현하고자 하는 기능이 구현이 되면... 진짜 엄청 뿌듯하다.😆