ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [RxSwift/RxCocoa] RxCocoa에서 TableView사용하는 코드를 쪼개서 이해해보자.
    앱등이에게 살충제를 뿌린다./Swift 2020. 3. 15. 20:48




    RxCocoa-TableView사용을 위해 구글링을 해보면 아래와 같은 예제소스가 가득하다. 

    // <UITableView+Rx.swift에 있는 예제코드>


    let items = Observable.just([ "First Item", "Second Item", "Third Item" ]) 


    items .bind(to: tableView.rx.items) { (tableView, row, element) in 

    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")! 

    cell.textLabel?.text = "\(element) @ row \(row)" return cell 

    }

    .disposed(by: disposeBag)




    코드를 좀 이해해보기 위해서

    UITableView+Rx.swift를 들어가보면 items는 이렇게 정의되어 있다. 

    (3개의 items메소드가 있는데 그 중 1개만 살펴보자.)


    Binds sequences of elements to table view rows. 


    - parameter source: Observable sequence of items. 

    - parameter cellFactory: Transform between sequence elements and view cells. 

    - returns: Disposable object that can be used to unbind.


    public func items<Sequence: Swift.Sequence, Source: ObservableType> 

    (_ source: Source) 

    -> (_ cellFactory: @escaping (UITableView, Int, Sequence.Element) -> UITableViewCell) 

    -> Disposable 

    where Source.Element == Sequence { 

    return { cellFactory in 

    let dataSource = RxTableViewReactiveArrayDataSourceSequenceWrapper<Sequence>(cellFactory: cellFactory) 

    return self.items(dataSource: dataSource)(source) 

    }


    솔직히 이 코드를 보고나서 이해가 잘 안되었다. ->는 왜케 많고 제네릭이 나오면 일단 뇌정지 오는 부분 ㅜㅜ


    이 메소드 선언만보고 사용 예제 코드를 이해하기가 어려워서 예제코드를 좀 쪼개보았다.

    let items = Observable.just([ "First Item", "Second Item", "Third Item" ]) 


    // 1

    let cellFactory = items.bind(to: tableView.rx.items)  


    // 2

    let disposable = cellFactory({ tableView, row, element in 

    return UITableViewCell() 

    }) 


    // 3

    disposable.disposed(by: bag)


    1.

    tableView.rx.items에 items를 바인딩한다.

    items메소드의 source 파라미터에 Observable<String>이 전달된 것이다.

    cellFactory의 타입은 (_ cellFactory: @escaping (UITableView, Int, Sequence.Element) -> UITableViewCell) -> Disposable의 클로져다.

    그 와중에 파라미터는 또 클로져로 받는다. (뇌정지 2차)


    2.

    cellFactory에 전달하는 클로져는 tableView, row, model을 사용하여 Cell을 만들어 주는 역할을 한다.

    따라서 사용하기는 쉽다.


    3.

    cellFactory의 리턴타입은 disposeble이니깐 disposeBag에 담아주었다.


    아으...

    Rx는 메소드 체이닝이 너무 많아서 뇌정지가 자주온다...



Designed by Tistory.