๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS/RxSwift

[iOS/RxSwift] RxDataSource - UITableView, UICollectionView

by Danna 2021. 10. 17.
728x90
728x90

RxSwift

 

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 ์‹œ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ฐธ๊ณ  ๋งํฌ

728x90
728x90