RxSwift와 MVVM을 활용해 TableView에 데이터 집어넣기
기록용! 📝
먼저 MVVM 패턴에 대해서 간단하게 다시 짚어보기
- Model : 데이터 구조 표현 및 처리
- ViewModel : View - Model 사이에서 데이터를 주고받는다(데이터를 가공)
- View : 사용자에게 보여주는 UI요소 처리(bind)
RxSwift로 TableView 생성하는 예시
1. Model
struct Item {
let title: String
}
→ 테이블 뷰에 들어갈 아이템 데이터 구조를 String으로 정의한다
2. ViewModel
class ItemsViewModel {
// Observable로 데이터를 정의
let items: BehaviorRelay<[Item]> = BehaviorRelay(value: [
Item(title: "Item 1"),
Item(title: "Item 2"),
Item(title: "Item 3")
])
}
→ Model의 Item을 사용하여 title의 데이터를 생성한다
⭐️ 데이터의 형식과 실제 데이터를 연결하는 작업 ⭐️
3. View (Controller)
viewModel.items
.bind(to: tableView.rx.items(cellIdentifier: "cell", cellType: UITableViewCell.self)) { index, item, cell in
cell.textLabel?.text = item.title
}
.disposed(by: disposeBag)
→ View에서 만든 textLabel의 text에 ViewModel의 데이터를 binding 한다
그러면 ViewModel은 어떻게 title이 String타입인지 알고있을까?
따로 연결해 준적이 없는데...??
Model에서 title이 String으로 정의되었으므로
Swift의 타입시스템을 통해 ViewModel에서 자동으로 타입추론이 된다
그럼 다른 구조체에 동일한 title이라는 데이터형식을 만들고 싶다면?
그냥 다른 모델에 정의해 주면 된다
struct Book {
let title: String
let author: String
}
struct Movie {
let title: String
let director: String
}
사용 시에는 아래처럼 구분하여 사용할 수 있다
//ViewModel
class ContentViewModel {
let books = [Book(title: "Swift Programming", author: "Author A")]
let movies = [Movie(title: "Swift Movie", director: "Director B")]
}
//View Controller
let viewModel = ContentViewModel()
// books와 movies를 각각 사용할 때 타입에 따라 title을 구분
for book in viewModel.books {
print(book.title) // Book의 title
}
for movie in viewModel.movies {
print(movie.title) // Movie의 title
}
'🍎 Swift > iOS 학습 노트' 카테고리의 다른 글
[Swift🍎] URLSession 뜯어보기 (0) | 2025.01.17 |
---|---|
[Swift🍎] tableView, collectionView 식별자 간단하게 관리하기! (1) | 2024.10.31 |
[Swift🍎] RxGesture로 간편하게 View에 클릭이벤트 넣기 (0) | 2024.10.17 |
[Swift🍎] UIColor를 CGColor에 할당해야 하는 경우 (0) | 2024.10.16 |
[Swift🍎] RxSwift에서 bind와 driver의 차이 (0) | 2024.10.14 |