RxCoocoa는 "UIKit 및 Cocoa 개발을 지원하는 Rx 클래스, RxSwift의 확장" 정도로 생각하면 좋겠다.
아래 간단한 두개의 예시로 Rx로 UI를 더 간결하게 처리 할 수 있는 기능들을 보여주고자 한다.
//기존 우리가 UIButton에 touchUpInside이벤트를 처리하는 방법
@objc func onClickButton(_ sender: UIButton) {
//버튼 엑션
}
self.someButton.addTarget(
self,
action:#selector(self.onClickButton(:_),
forControlEvents: .touchUpInside
)
//RxCocoa를 사용한 처리방법
self.someButton.rx.tap
.bind { _ in
//버튼 액션
}.disposed(by: self.disposeBag)
이전과 비교해 항상 직관적이지 못했던 addTarget이라는 과정을 setUp이나 viewDidLoad 등에서 해주었다.
보다 코드를 더 잘 분리할 수 있는 도움을 주지 않을까 생각하게 된다.
//기존의 UITableView
extension ViewController: UITableViewDataSource {
//데이터소스 구현
}
extension ViewController: UITableViewDelegate {
//델리게이트 구현
}
func viewDidLoad() {
self.tableView.delegate = self
self.tableView.dataSource = self
}
Rx를 사용하지 않는 UITableView에서는 항상 Delegation pattern으로 구현을 해주어야 했다.
RxCocoa에서 지원하는 bind 기능을 통해서 아래와 같이도 구현할 수 있게 된다.
DataSource의 기능을 대체할 수 있다.
let cities = Observable.of(["Lisbon", "Copenhagen", "London", "Madrid", "Vienna"])
cities.bind(to: tableView.rx.items) { (tableView, index, element) in
let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
cell.textLabel?.text = element
return cell
}.disposed(by: disposeBag)