apple/UIKit & ReactiveX

🐉 RxSwift + MVVM (TableView) 코드1

lgvv 2021. 7. 15. 15:45

✅ 이번 시간에는 스터디에서 공부했던 테이블 뷰 코드리뷰를 할 생각이야.

 

❗️주의사항  - RxSwift를 주로 사용하였으며, RxCocoa를 사용한 코드는 따로 포스팅을 다시할 예정.

(쉽게 말해서 .bind, rx.tap 등을 사용하지 않고 delegate와 dataSource로 작성하였음)

 

MVVM 패턴 및 Singleton패턴을 사용하였음.

 

코드를 볼 수 있는 곳 : https://github.com/lgvv/MVVM_RxSwift/tree/main/week2_lgvv_pratice

 

lgvv/MVVM_RxSwift

MVVM 패턴과 RxSwift 를 학습하고, 이를 적용한 프로젝트를 개발하기 위한 스터디모임입니다. - lgvv/MVVM_RxSwift

github.com

 

 

 

🟠 뷰의 구성도

뷰 구성

 

 

파일 구조도

 

 

✅ MVVM 설계

(MainView)

View : MainViewController를 구현

 

ViewModel : TableViewModel을 사용 

 - 싱글톤으로 만들어서 데이터를 공용으로 관리하게끔

 

Model : TableCell을 선언하여 사용

 - 메인 뷰의 IBOulet을 여기서 갖게 만들자

 

(DetailView)

View : DetailViewController를 구현

 

ViewModel : MainView의 TableViewModel을 같이 사용

 

가급적이면 데이터의 선언은 Model에서 데이터의 변경사항은 ViewModel에서 진행한다.

함수는 가급적이면 ViewModel에서 사용하고자 하였으며, IBOulet의 엮인 것들은 Model에서 작성하였다.

 

✅ performSegue

 - 데이터 전달의 한 방법인데, 이건 자꾸 까먹어서 찾아보게 된다.

 

extension MainViewController : UITableViewDelegate {
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let row = indexPath.row
        performSegue(withIdentifier: "DetailViewController", sender: row)
        
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
        guard let id = segue.identifier,
            id == "DetailViewController",
            let detailVC = segue.destination as? DetailViewController,
            let row = sender else {
            return
        }
        
        detailVC.row = row as? Int
        
    }
    
}