import Foundation
import RxDataSources
struct SectionModel {
let header: String
var items: [FoodModel]
}
extension SectionModel: SectionModelType {
init(original: SectionModel, items: [FoodModel]) {
self = original
self.items = items
}
}
SectionModelType
에 따라 현재 섹션 모델 정보 및 변경된 아이템으로 세팅 → 섹션 내 아이템의 변동을 감지 가능let tableViewItemSection = [SectionModel(header: "Main Courses", items: [FoodModel(name: "Hamburger", imageName: "hamburger"), FoodModel(name: "Pizza", imageName: "pizza"), FoodModel(name: "Bulgogi", imageName: "bulgogi")]), SectionModel(header: "Desserts", items: [FoodModel(name: "Coke", imageName: "coke")])]
lazy var tableViewItemSectionsRx = BehaviorRelay.init(value: tableViewItemSection)
tableViewItemSection
BehaviorRelay
로 이니셜라이즈 → 변화 감지 및 곧바로 작업을 수행 가능한 Observable + Observerlet dataSource = RxTableViewSectionedReloadDataSource<SectionModel>(configureCell: {
ds, tv, indexPath, item in
let cell: CustomTableViewCell
if let dequeuedCell = tv.dequeueReusableCell(withIdentifier: "customTableViewCell", for: indexPath) as? CustomTableViewCell {
cell = dequeuedCell
} else {
cell = CustomTableViewCell()
}
cell.cellLabel.text = item.name
cell.cellImage.image = UIImage(named: item.imageName)
return cell
}, titleForHeaderInSection: {
ds, index in
return ds.sectionModels[index].header
})
private func setSearchingTableViewWithSection() {
searchBar.rx.text.orEmpty
.throttle(.milliseconds(300), scheduler: MainScheduler.instance)
.distinctUntilChanged()
.map { query in
self.tableViewItemSectionsRx.value.map { sectionModel in
SectionModel(header: sectionModel.header, items: sectionModel.items.filter({ foodModel in
if query.isEmpty || foodModel.name.lowercased().contains(query.lowercased()) {
return true
} else {
return false
}
}))
}
}
.bind(to: tableView
.rx
.items(dataSource: dataSource))
.disposed(by: disposeBag)
}
map
고차 함수 클로저 내부에서 해당 섹션 내 아이템이 현재 검색된 서치 바 텍스트와 일치되는지를 필터링, 불리언 값으로 리턴.items(dataSource:)
메소드섹션 정보까지 매우 간단하게 RxSwift화할 수 있다는 것을 배웠다!