UIComponent들을 RxCocoa 를 통해 이벤트 컨트롤 하기.
* 이 포스트는 RxSwift 2.6 버전을 기준으로 작성되었습니다.
지금까지 RxSwift 의 메서드들을 정리해왔는데, 실제로 실무에서는 어떻게 사용해야 할지 체감이 잘안되고 지루할 수도 있기에 RxCocoa, RxDataSources 를 통해 실제 사용예를 샘플과 함께 알아보겠다.
RxCocoa 를 실제 프로젝트에 적용해보면서 점차적으로 많은 RxSwift 메서드들을 활용하면 장점을 더 쉽게 체감할 수 있을 것 같다. 쉬운 예제 위주로 할 글들이 될것 같다.
이미 Rx에 익숙하신 분들이라면, 뒤로가기 고고~
버튼이벤트를 핸들링 하는 예제이다.
예제
let disposeBag = DisposeBag()
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
button.rx_tap.subscribeNext{ _ in
print("Click!!")
}.addDisposableTo(disposeBag)
}
결과
버튼을 클릭할때마다 "Click!" 이 프린팅 될것이다.
RxCocoa를 사용하기 전에 어떻게 했는지 비교해보자.
func pressed(sender: UIButton!){
print("Click")
}
override func viewDidLoad() {
super.viewDidLoad()
button.addTarget(self, action: #selector(ViewController.pressed(_:)), forControlEvents: .TouchUpInside)
}
이렇게 하거나
@IBAction func pressed(sender: UIButton!){
print("Click")
}
요렇게 만들어서 XIB 와 연결했다.
XIB로 연결한 후자의 경우가 Rx 보다 더 심플한데 굳이 Rx 를써야 하나? 라는 의문이 들수 있다.
이런 경우를 생각해보자.
UITextField 로 Text 를 입력받고 버튼을 누르면 해당 텍스트로 어떤 동작을 한다고 가정하자.
텍스트가 변경되지 않으면 버튼을 눌러도 동작을 하지 않게 하고싶다.
보통 Rx 를 사용하지 않고 위와 같은 동작을 구현한다면, TextField 의 값이 변경되는지를 핸들링하거나, 버튼이 눌렸을때 text 값을 저장해두고 버튼이 눌릴때 현재 값과 이전값을 비교하는 등등의 작업을 하는 형태등등으로 구현할 것 같다.
Rx 를 사용하면 아래와 같이 구현하면 된다.
button.rx_tap.map{ [weak self] _ in
return self?.textField.text
}.distinctUntilChanged({ (lhs, rhs) -> Bool in
return lhs == rhs
}).subscribeNext{ item in
print("\(item)")
}.addDisposableTo(disposeBag)
버튼 tap 이벤트를 map 을 통해 textfield의 현재 String 이벤트로 변환하고, distinctUntilChanged 메서드를 통해 값이 변경될 경우에만 이벤트가 발생되도록 필터링한다.
이처럼 다양한 메서드들의 조합을 통해 이벤트 조건이 분명한 Observable 을 만들수 있다.
다음 포스팅에서는 RxDataSource 를 통해 TableView 를 구성하는 몇가지 방법에 대해 알아보자.