본문 바로가기

Swift 공부

RxDataSources Multiple Object Multiple Section

RxDataSources를 사용하다보면 여러개의 색션 여러타입의 오브젝트를 사용해야할 필요가 있었는데 그때마다 조금씩 햇갈리는게 있어

 

이번에 정식 RxSwift 예제로 공부를 다시해볼려고한다.

 

 static func dataSource() -> RxTableViewSectionedReloadDataSource<MultipleSectionModel> {
        return RxTableViewSectionedReloadDataSource<MultipleSectionModel>(
            configureCell: { dataSource, table, idxPath, _ in
                switch dataSource[idxPath] {
                case let .ImageSectionItem(image, title):
                    let cell: ImageTitleTableViewCell = table.dequeueReusableCell(forIndexPath: idxPath)
                    cell.configure(image: image, title: title)
                    return cell
                case let .StepperSectionItem(title):
                    let cell: TitleSteperTableViewCell = table.dequeueReusableCell(forIndexPath: idxPath)
                    cell.configure(title: title)
                    return cell
                case let .ToggleableSectionItem(title, enabled):
                    let cell: TitleSwitchTableViewCell = table.dequeueReusableCell(forIndexPath: idxPath)
                    cell.configure(title: title, isEnabled: enabled)
                    return cell
                }
            },
            titleForHeaderInSection: { dataSource, index in
                let section = dataSource[index]
                return section.title
            }
        )
    }



enum MultipleSectionModel {
    case ImageProvidableSection(title: String, items: [SectionItem])
    case ToggleableSection(title: String, items: [SectionItem])
    case StepperableSection(title: String, items: [SectionItem])
}

enum SectionItem {
    case ImageSectionItem(image: UIImage, title: String)
    case ToggleableSectionItem(title: String, enabled: Bool)
    case StepperSectionItem(title: String)
}

extension MultipleSectionModel: SectionModelType {
    typealias Item = SectionItem
    
    var items: [SectionItem] {
        switch  self {
        case .ImageProvidableSection(title: _, items: let items):
            return items.map { $0 }
        case .StepperableSection(title: _, items: let items):
            return items.map { $0 }
        case .ToggleableSection(title: _, items: let items):
            return items.map { $0 }
        }
    }
    
    init(original: MultipleSectionModel, items: [Item]) {
        switch original {
        case let .ImageProvidableSection(title: title, items: _):
            self = .ImageProvidableSection(title: title, items: items)
        case let .StepperableSection(title, _):
            self = .StepperableSection(title: title, items: items)
        case let .ToggleableSection(title, _):
            self = .ToggleableSection(title: title, items: items)
        }
    }
}

extension MultipleSectionModel {
    var title: String {
        switch self {
        case .ImageProvidableSection(title: let title, items: _):
            return title
        case .StepperableSection(title: let title, items: _):
            return title
        case .ToggleableSection(title: let title, items: _):
            return title
        }
    }
}

RxTableViewSectionedReloadDataSource<MultipleSectionModel> 를 이용하여 DataSource를 만들어주고

 

안에있는 데이터 타입을 어떻게 넣는지가 중요한데 우선 RxDataSource를 사용하기 위해

여러개의 색션을 받을 수 있는 MultipleSectionModel을 enum으로 만들어준다

 

RxDataSource에서 사용하기위해  MultipleSectionModel에 SectionModelType 적용하고 내가 원하는 아이템의 형식을

SectionItem에 넣어 준후 RxDataSource에서 색션에 맞춰 셀 처리를 해주면 간단하게 끝

 

그리고 기존의 RxDataSource와 동일한 방식으로 처리해주면 끝 

 

여기서 조금 주의해야할점이 데이터를 접근하는 방법인데 공부를 하기전에는

switch 문이아닌 if else 문으로 접근을 해서 item에 접근을 할 수 없었다.  그래서 SectionItem에 함수를 만들어서 데이터를 리턴했었는데 switch 문으로 접근하면 바로 데이터에 접근이 가능하니 이 점을 주의하면 될 것 같다. 

 

'Swift 공부' 카테고리의 다른 글

Property Wrapper  (0) 2022.04.12
RxMoya를 직접 만들어서 사용해보자  (0) 2022.04.08
Swift Throw Error Handling  (0) 2022.04.07
Async / await의 도입 스위프트 5.5  (0) 2022.04.05
Swift WMO  (0) 2022.04.04