brunch

You can make anything
by writing

C.S.Lewis

by Tilltue Aug 20. 2016

RxCocoa, 시작하기

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 를 구성하는 몇가지 방법에 대해 알아보자.


매거진의 이전글 RxCocoa, UITableView 구현 #1
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari