RxSwift ์์ DataSource ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค!
UIKit ์ UITableView, UICollectionView ๋ฅผ ์ด์ฉํ ๋์๋ ๊ฐ ๋ฆฌ์คํธ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ํํํ๊ธฐ ์ํด data source ๋ฅผ ์ง์ ํด์ค์ผ ํ๋๋ฐ์. ๊ธฐ๋ณธ์ ์ผ๋ก๋ data source ํ๋กํ ์ฝ์ ์ฑํํด, ๋ฉ์๋๋ฅผ ๊ตฌํํด ๋ฐ์ดํฐ๋ฅผ ํํํฉ๋๋ค. RxSwift ์ RxDataSource ์์๋ data source ๋ฉ์๋๋ฅผ ์ง์ ๊ตฌํํ์ง ์๊ณ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์คํผ๋ ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
1. UIKit ์์ data source ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ
2. RxSwift ์์ data source ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ
3. RxDataSource ๋ฅผ ์ด์ฉํด data source ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ
1. UIKit ์์ data source ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ
UIKit ์ UITableView, UICollectionView ๋ฅผ ์ด์ฉํ ๋์๋ ๊ฐ ๋ฆฌ์คํธ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ํํํ๊ธฐ ์ํด data source ๋ฅผ ์ง์ ํด์ค์ผ ํ๋๋ฐ์. ๊ธฐ๋ณธ์ ์ผ๋ก๋ data source ํ๋กํ ์ฝ์ ์ฑํํด, ๋ฉ์๋๋ฅผ ๊ตฌํํด ๋ฐ์ดํฐ๋ฅผ ํํํฉ๋๋ค.
TableView, CollectionView ์ data source ํ๋กํ ์ฝ์ ๋๊ฐ์ง ๋ฉ์๋๋ฅผ ๋ฐ๋์ ๊ตฌํํด์ผํฉ๋๋ค.
- ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ ๋ช ๊ฐ์ธ์ง
- tabelView(_:numberOfRowsInSection:)
- collectionView(_:numberOfItemsInSection:) - ๋ฐ์ดํฐ์ ๊ฐ ์
์ ์ด๋ป๊ฒ ํํํ ์ง
- tabelView(_:cellForRowAt:)
- collectionView(_:cellForItemAt:) - UITableViewDataSource
- UICollectionViewDataSource
2. RxSwift ์์ data source ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ
RxCocoa (RxSwift) ์์๋ TableView, CollectionView ์ data source, delegate ํ๋กํ ์ฝ๋ก ์ค์ ํ๋ ๋ฉ์๋๋ค์ ์คํผ๋ ์ดํฐ๋ก ์ ๊ณตํด์. data source ํ๋กํ ์ฝ์ ์ฑํํด ๋ฉ์๋๋ฅผ ๊ตฌํํ๊ณ ์ค์ ํ๋ ๊ณผ์ ์ด ๋ฒ๊ฑฐ๋กญ๋ค๊ณ ์ฌ๊ฒจ์ ธ ์ ๊ณตํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค !
์ ๊ณตํ๋ ์คํผ๋ ์ดํฐ๋ rx.items ๋ก, ๋งค๊ฐ๋ณ์์ ํ์ ์ด ์ฌ๋ฌ๊ฐ์ง ํํ๋ก ์ ๊ณต๋ฉ๋๋ค.
rx.items(dataSource:protocol<RxTableViewDataSourceType, UITableViewDataSource>)
rx.items(cellIdentifier:String)
rx.items(cellIdentifier:String:Cell.Type:_:)
rx.items(_:_:)
RxCocoa ์ ์คํผ๋ ์ดํฐ๋ฅผ ์ด์ฉํด tableView, collectionView ์ ๋ฐ์ดํฐ๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- TableView ์ ๋ณด์ฌ์ค ๋ฐ์ดํฐ๋ฅผ Observable ํํ๋ก ๋ณํํ๊ธฐ (data stream)
- ๋ฐ์ดํฐ ์คํธ๋ฆผ์ items ์คํผ๋ ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉํ๋ค.
- items ์คํผ๋ ์ดํฐ์ ๊ฐ ์ ์ ์ด๋ป๊ฒ ํํํ ์ง ์์ฑํ๋ค.
let members = Observable<String>.just(["Song", "Kim", "Lee"])
members.bind(to: tableView.rx.items(cellIdentifier: MemberCell.identifier))
{ index, member, cell in
cell.initUI(of: member)
}
.disposed(by: bag)
3. RxDataSource ๋ฅผ ์ด์ฉํด data source ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ
RxCocoa ์์๋ data source ์ ๋ํด ์ถฉ๋ถํ ์คํผ๋ ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ๊ฒ ๊ฐ์ง๋ง, ์ RxDataSource ๋ฅผ ๋ง๋ค์์๊น? RxDataSource ์์ ์ง์ ํ๋ rx.items ์คํผ๋ ์ดํฐ์ ๋ฌธ์ ์ ์ ๋ค์๊ณผ ๊ฐ์์.
- ์ฌ๋ฌ Section ์ ๋ํด ๋ฐ์ดํฐ ์ ์ ๋ฐ์ธ๋ฉํ๊ธฐ ์ด๋ ต๋ค.
- ์์ดํ ์ถ๊ฐ / ์์ / ์ญ์ ๋ฑ์ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ๊ธฐ ์ด๋ ต๋ค.
RxDataSource ๋ ์์ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค! ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ์คํผ๋ ์ดํฐ์ ํ๋กํ ์ฝ, ํด๋์ค๋ ๋ค์๊ณผ ๊ฐ์์.
- rx.items(dataSource:) ์คํผ๋ ์ดํฐ๋ฅผ ์ ๊ณตํ๋ค.
- ์ฌ๋ฌ Section ์ ๋ํด ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ ์ ์๋ SectionModelType ํ๋กํ ์ฝ์ ์ ๊ณตํ๋ค.
- Section ์ ๋ํ ์ค์ , Animation ์ ์ ์ฉํ ์ ์๋ DataSource ํด๋์ค๋ฅผ ์ ๊ณตํ๋ค.
RxDataSource ๋ฅผ ์ด์ฉํด TableView, CollectionView ์ data source ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Data ๋ฅผ ๋ณด์ฌ์ค Custom Model ์ ์์ฑํ๋ค.
- Section ์ ์ ์ํ๊ธฐ ์ํด SectionModelType ํ๋กํ ์ฝ์ ์ฑํํ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- Section ๊ตฌ์กฐ์ฒด ํ์ ์ ์ธ์๋ก ํ ๋นํด Data Source ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
- rx.items(dataSource:) ์คํผ๋ ์ดํฐ๋ฅผ ํตํด data source ๋ฅผ ์ค์ ํ๋ค.
let dataSource = RxTableViewSectionedReloadDataSource<SectionOfCustomData>(
configureCell: { dataSource, tableView, indexPath, item in
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = "Item \(item.anInt): \(item.aString) - \(item.aCGPoint.x):\(item.aCGPoint.y)"
return cell
})
dataSource.titleForHeaderInSection = { dataSource, index in
return dataSource.sectionModels[index].header
}
dataSource.canEditRowAtIndexPath = { dataSource, indexPath in
return true
}
# SectionModelType ํ๋กํ ์ฝ
- ์น์ ์ด ๋ํ๋ผ ๋ฐ์ดํฐ ํ์ ์ Item typealias ๋ก ์ ์ํ๋ค.
- ์น์ ์ด ๋ํ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ items ์์ฑ์ ์ ์ํ๋ค.
# Data Source ํด๋์ค
- Data Source ํด๋์ค๋ ์ ๋๋ฉ์ด์
์ ํฌํจํ๋์ง์ ๋ฐ๋ผ ๊ตฌ๋ถ๋๋ค.
- RxTableViewSectionedReloadDataSource, RxTableViewSectionedAnimatedDataSource
- RxCollectionViewSectionedReloadDataSource, RxCollectionViewSectionedAnimatedDataSource - Data Source ํด๋์ค ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ SectionModelType ํ๋กํ ์ฝ์ ์ฑํํ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ๋๋ฆญ ํ์ ์ผ๋ก ์ง์ ํ๋ค.
- Data Source ํด๋์ค๋ configureCell ์ ๊ธฐ๋ณธ ์ธ์๋ก ๊ฐ๋๋ค.
- ๊ทธ ์ธ์ titleForHeaderInSection, titleForFooterInSection, canEditRowAtIndexPath, canMoveRowAtIndexPath ๋ฑ์ ์ธ์๋ฅผ ๊ฐ๋๋ค. - ํด๋น ์ธ์๋ค์ ์ธ์คํด์ค ์์ฑ๊ฐ์ ํตํด ์ค์ ํ ์ ์๋ค.
- ์ ๋๋ฉ์ด์
์ ์ค์ ํ๊ธฐ ์ํด์๋ AnimatedDataSource ๋ฅผ ์ด์ฉํ๋ค.
- ํด๋น ํด๋์ค๋ animationConfiguration, decideViewTransition ์ธ์๋ฅผ ์ถ๊ฐ๋ก ๊ฐ๋๋ค.
- AnimationConfiguration ๋ insert, reload, delete ์์ ์ ๋๋ฉ์ด์ ์ ์ค์ ํ ์ ์๋ค.