쉽게 배우는 RxSwift (#3) - stream

TL;DR

  1. RxSwfit의 데이터 흐름을 stream이라고 합니다.
  2. Observablestream으로써 종단에는 subscribe 하여 사용합니다.
  3. subscribe가 없으면 Observable은 동작하지 않습니다.
  4. stream에 흐르는 동안에 Operator를 통해서 데이터를 조작할 수 있습니다.

Everything is stream

RxSwift 는 비동기 처리를 지원합니다.
그 처리의 중심에는 stream 이 있습니다.
stream은 데이터의 흐름입니다.

데이터의 발생(Generator)부터 데이터의 소비(Consumer)까지 데이터가 흐르는 통로를 만들고, 이 통로를 통해서 데이터를 전달하겠다는 아이디어 입니다.

생각해보면, 미래에 발생하는 것이 데이터이건, 이벤트 이건, 사용자 입력이던 구분될 필요는 없습니다. 무엇이든 나중에 비동기 적으로 발생하는 (통칭)정보를 나중에 누군가 필요한 곳(Consumer)에 전달하겠다는 의미는 동일합니다.


Observable ➜ subscribe

그러니까 발생에서 -> 소비까지를 서로 연결해서 흐르는 통로만 만들어 주면 되는 것입니다. 이러한 통로를 stream 이라고 합니다.

RxSwift 에서는 이러한 streamObservable 이라고 합니다. Observable (혹은 ObservableType) 은 stream 으로 데이터의 흐름을 의미합니다.

stream은 분기될 수도 있고, 합칠 수도 있습니다.
그리고 그 중간에서 데이터를 변경시키거나 조작할 수도 있습니다. 그리고 그 여정의 끝은 subscribe입니다.

stream의 끝에서 subscribe함으로써 그 데이터를 사용(Consume)할 수 있습니다.

1
Observable -> (stream) -> subscribe

lazy하게 동작하기 위해서 subscribe이 되지 않으면 그 stream은 흐르지 않습니다. 그래서 Observable만 잔뜩 만들어 놓는다고 해도 subscribe하지 않으면 동작하지 않습니다.

stream의 중간에서 데이터를 빼내서 사용하지는 못합니다. 사용하고자 하는 데이터는 모두 subscribe을 통해서만 사용하게 됩니다.

서두에 언급한 것 처럼, 데이터나 이벤트나 사용자 입력등을 RxSwift를 사용해서 처리하겠다고 한다면 최종으로 사용할 곳 까지 stream을 연결시키는 것이 RxSwift 프로그래밍 입니다.


Stream Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@IBOutlet var plusButton: UIButton!
@IBOutlet var minusButton: UIButton!

let stream1 = plusButton.rx.tap
.throttle(0.5, latest: false, scheduler: MainScheduler.instance)
.map { _ in 1 }

let stream2 = minusButton.rx.tap
.throttle(0.5, latest: false, scheduler: MainScheduler.instance)
.map { _ in -1 }

Observable.merge(stream1, stream2)
.subscribe(onNext: addCounting)
.disposed(by: disposeBag)

여기서 버튼의 tap 이벤트를 0.5초동안 반복터치를 배제하면서 받아들여 +1과 -1로 변형하고 있습니다.

이 각각의 stream 흐름을 하나로 합쳐서(merge) 사용(subscribe)하는 것을 볼 수 있습니다.


next: Operator

map 이나 throttle 의 생소한 것이 나왔습니다. 대충 살펴봤을 때 stream에 흘러가는 데이터에 조작을 가하는 것으로 보여집니다. 이처럼 흘러가는 데이터를 조작하는 것을 Operator 라고 합니다.

다음에는 이 Operator 를 살펴보겠습니다.