[swift] RxDataSources를 사용한 셀 선택 및 이벤트 처리 방법

개요

iOS 앱 개발에서 테이블뷰나 컬렉션뷰에 대한 데이터 소스 관리는 중요한 부분입니다. RxDataSources는 RxSwift와 결합하여 테이블뷰 또는 컬렉션뷰에서 간편하게 데이터를 사용하고 관리하는 도구입니다. 이 글에서는 RxDataSources를 사용하여 셀 선택 및 이벤트 처리하는 방법을 알아보겠습니다.

RxDataSources 설치

RxDataSources는 CocoaPods나 Carthage를 통해 설치할 수 있습니다. 이 글에서는 CocoaPods을 사용하여 설치하는 방법을 알아보겠습니다.

  1. Podfile 파일을 열고 아래와 같이 RxSwift 및 RxDataSources를 추가합니다.
pod 'RxSwift'
pod 'RxCocoa'
pod 'RxDataSources'
  1. 터미널을 열고 다음 명령어를 실행하여 의존성을 설치합니다.
pod install
  1. 프로젝트를 열고 import RxDataSources를 추가합니다.

셀 선택 처리

RxDataSources를 사용하면 Observable 형태로 테이블뷰 또는 컬렉션뷰의 데이터를 관리할 수 있습니다. 따라서 셀 선택 이벤트도 Observable 형태로 전달됩니다.

let items = Observable<[String]>.just([
    "Item 1",
    "Item 2",
    "Item 3"
])

items
    .bind(to: tableView.rx.items(cellIdentifier: "cell")) { index, item, cell in
        cell.textLabel?.text = item
    }
    .disposed(by: disposeBag)

tableView
    .rx
    .modelSelected(String.self)
    .subscribe(onNext: { item in
        // 선택한 셀 처리
    })
    .disposed(by: disposeBag)

위 코드에서 itemsObservable<[String]> 형태로 테이블뷰의 데이터를 관리합니다. 그리고 bind를 통해 테이블뷰 셀과 데이터를 바인딩합니다.

마지막 부분에서는 tableView.rx.modelSelected(String.self)를 통해 셀 선택 이벤트를 처리합니다. 선택한 셀에 대한 처리는 subscribe 내부에서 수행합니다.

셀 이벤트 처리

각 셀마다 특정 이벤트를 처리하고 싶은 경우에는 delegate를 사용하여 수행할 수 있습니다. 예를 들어, 버튼이 있는 셀에서 버튼 클릭 이벤트를 처리하는 경우를 살펴보겠습니다.

struct Item {
    let title: String
    let isFavorite: Bool
}

let items = Observable<[Item]>.just([
    Item(title: "Item 1", isFavorite: false),
    Item(title: "Item 2", isFavorite: true),
    Item(title: "Item 3", isFavorite: false)
])

items
    .bind(to: collectionView.rx.items(cellIdentifier: "cell")) { index, item, cell in
        // 셀 설정
        
        cell.button.rx.tap
            .subscribe(onNext: { _ in
                // 버튼 클릭 이벤트 처리
                item.isFavorite.toggle()
            })
            .disposed(by: cell.disposeBag)
    }
    .disposed(by: disposeBag)

위 코드에서는 Item 구조체를 사용하여 셀의 데이터를 관리합니다. bind를 통해 컬렉션뷰 셀과 데이터를 바인딩합니다.

마지막 부분에서는 셀 내부에 있는 버튼 클릭 이벤트를 처리하기 위해 cell.button.rx.tap을 사용합니다. 버튼을 클릭할 때마다 item.isFavorite 값을 토글합니다.

결론

RxDataSources는 RxSwift와 함께 사용하면 테이블뷰나 컬렉션뷰의 데이터 소스 관리를 쉽게 할 수 있습니다. 셀 선택 및 이벤트 처리 역시 Observable 형태로 간단하게 처리할 수 있습니다. 이 글에서는 간단한 예제를 통해 사용 방법을 알아보았습니다. 추가적으로 RxDataSources에 대한 자세한 정보는 공식 문서를 참고하시기 바랍니다.