관리 메뉴

김종권의 iOS 앱 개발 알아가기

[RxCocoa] 1. 맛보기 본문

RxSwift/RxCocoa

[RxCocoa] 1. 맛보기

jake-kim 2020. 6. 28. 22:24

1. RxCocoa란?

다양한 protocol을 extension한 것들과 UIKit을 위한 rx영역을 제공하는 프레임워크

RxCocoa는 단방향성을 갖음

- Producer는 값을 생성하고, Consumer는 값을 처리

bind

* 이벤트를 발생하는 producer가 처리하는 consumer에게 bind(to:)시키는 것이 중요

 

2. 사용

1) RxCocoa없이 생성

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    @IBOutlet weak var tableView: UITableView!
    
    // 테이블뷰 데이터
    let items = ["1", "2", "3", "4", "5"]

    // 섹션내 셀의 수를 지정한다.
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }
    
    // 각 셀을 구성한다.
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = items[indexPath.row]
        return cell
    }

    // 셀을 클릭했을 때 데이터 값을 출력한다.
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("\(items[indexPath.row])")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 테이블 뷰의 데이터 소스와 델리게이트를 설정한다.
        tableView.delegate = self
        tableView.dataSource = self
        
    }
}


2) RxCocoa 사용

- 핵심은 bind(to:), tableView.rx.items(cellIdentifier:cellType:)

import UIKit
import RxSwift
import RxCocoa

class ViewController : UIViewController {
    
    @IBOutlet weak var tableView: UITableView!
    var disposeBag = DisposeBag()
    let items = ["1", "2", "3", "4", "5"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let items = Observable.just(
            (1...5).map { "\($0)" }
        )
    
        // 각 셀을 구성한다.
        items
            .bind(to: tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { (row, element, cell) in
                cell.textLabel?.text = "\(element)"
            }
            .disposed(by: disposeBag)

        // 셀을 클릭했을 때 데이터 값을 출력한다.
        tableView.rx
            .modelSelected(String.self)
            .subscribe(onNext:  { item in
                print("\(item)")
            })
            .disposed(by: disposeBag)
    }
}

 

*참조

blog.naver.com/tmondev/221064638672

Comments