JEP's Diary

리액티브 연산자2 본문

Development/Reactive

리액티브 연산자2

지으니88 2018. 7. 28. 21:02

리액티브 연산자2


생성연산자는 Observable로 데이터 흐름을 만들고 변환 연산자와 필터 연산자는 데이터 흐름을 내가 원하는 방식으로 변형한다.

: 생성 연산자

 just(), fromXXX(), create(), interval(), ranger(), timer(), intervalRange(), defer(), repeat()

: 변환 연산자

map(), flatMap(), concatMap(), switchMap(), groupBy(), scan(), buffer(), window()

: 필터 연산자

filter(), take(), skip(), distinct()

: 결합 연산자

zip(), combineLastest(), merge(), concat()

: 조건 연산자

amb(), takeUntil(), skipUntil(), all()

: 에러 처리 연산자

onErrorReturn(), onErrorResumeNext(), retry(), retryUntil()

: 기타 연산자

subscribe(), subscribeOn(), observeOn(), reduce(), count()


1.생성 연산자

: 생성 연산자의 역할은 데이터 흐름을 만든다. 즉 Observable을 만든다.(Observable, Single, Maybe객체 등)

: interval()함수

일정 시간 간격으로 데이터 흐름을 생성한다. 현재 스레드가 아니라 계산을 위한 별도의 스레드에서 동작한다.

public static Observable<Long> interval(long period, TimeUnit unit)

public static Observable<Long> interval(long initialDelay, long period, TimeUnit unit)

: timer()함수

interval()함수와 유사하지만 한번만 실행하는 함수이다. 일정 시간이 지난 후 한개의 데이터를 발행하고 onComplete 이벤트가 발생한다. 역시 계산 스케줄러에서 실행된다.

public static Observable<Long> timer(long delay, TimeUnit unit)

: range()함수

주어진 값(n) 부터 m개의 Integer 객체를 발행한다. 앞서 interval()와 timer() 함수는 Long 객체를 발행했지만, range()함수는 Integer 객체를 발행한다.

현재 스레드에서 실행되며, 반복문을 대체 할 수 있다.

public static Observable<Integer> range(final int start, final int count)

: intervalRange()함수

interval()과 range()함수를 혼합해놓은 함수이다. 일정한 시간 간격으로 값을 출력하지만, 시작 숫자(n)로부터 m개만큼의 값만 생성하고 onComplete 이벤트가 발생한다. 계산 스케줄러에서 실행된다. 

: defer()함수

timer()함수와 비슷하지만 데이터 흐름 생성을 구독자가 subscribe() 함수를 호출할 때 까지 미룰 수 있다.

인자로는 Callable<Observable<T>>를 받기 때문에 구독자가 subscribe()를 호출 할때까지 call() 메서드의 호출을 미룰 수 있다.

: repeat()함수

단순히 반복 실행을 한다. 


2.변환 연산자

: 데이터의 흐름을 원하는 대로 변형 할 수 있는 변환 연산자.

: concatMap()함수

flatMap 함수와 매우 비슷하다. flatMap()함수는 먼저 들어온 데이터를 처리하는 도중에 새로운 데이터가 들어오면 나중에 들어온 데이터의 처리 결과가 먼저 출력 될 수도 있다. 이를 인터리빙(끼어들기)라고 한다. 하지만 concatMap()함수는 먼저 들어온 데이터 순서대로 처리해서 결과를 낼 수 있도록 보장한다.

: switchMap()함수

concatMap()함수가 동작의 순서를 보장해준다면 swtichMap() 함수는 순서를 보장하기 위해 기존에 진행 중이던 작업을 바로 중단한다. 여러개의 값이 발행되었을때 마지막에 들어온 값만 처리하고 싶을때 사용한다. 중간에 끊기더라도 마지막 데이터의 처리는 보장하기 때문이다.

센서 등의 값을 얻어와서 동적으로 처리하는 경우에 매우 유용하다. 센서값은 중간값보다는 최종적인 값으로 결과를 처리하는 경우가 많기때문이다. 

: groupBy()함수

어떤 기준(keySelector인자)으로 단일 Observable을 여러개로 이루어진 Observable그룹으로 만든다. 

: scan()함수

reduce()함수와 비슷하다. reduce() 함수는 Observable에서 모든 데이터가 입력 된 후 그것을 종합하여 마지막 1개의 데이터만을 구독자에게 발행했다. 반면 scan()함수는 실행할 때마다 입력값에 맞는 중간 결과 및 최종 결과를 구독자에게 발행한다. 


3.결합 연산자

: 여러개의 Observable을 내가 원하는 Observable로 결합할 수 있다.

: zip()함수

입력 Observable에서 데이터를 모두 새로 발행했을때 그것을 합해준다. 각각의 Observable을 모두 활용해 2개 혹은 그 이상의 Observable을 결합한다.

2개를 결합한다면 2개의 Observable에서 모두 데이터를 발행해야 결합 할 수 있고, 그전까지는 발행을 기다린다.

: combinesLastest()함수 

처음에 각 Observable에서 데이터를 발행한 후에는 어디에서 값을 발행하던 최신 값으로 갱신한다. 2개 이상의 Observable을 기반으로 Observable 각각의 값이 변경 되었을때 갱신해주는 함수. 첫번째 Observable에서만 데이터를 발행하거나, 두번째 Observable의 데이터 흐름만 있으면 구독자에게 어떤 데이터도 발행하지 않는다. 하지만 두 Observable 모두 값을 발행하면 그때는 결과값이 나오고, 그다음부터는 둘 중에 어떤 것이 갱신되던지 최신 결과값을 보여준다.

: merge()함수

최신 데이터 여부와 상관없이 각 Observable에서 발행하는 데이터를 그대로 출력한다. 입력 Observable의 순서와 모든 Observable이 데이터를 발행하든지 등에 관여하지 않고 어떤 것이든 업스트림에서 먼저 입력되는 데이터를 그대로 발행한다.

: concat()함수

입력된 Observable을 Observable 단위로 이어 붙여준다. 2개 이상의 Observable을 이어 붙여주는 함수이다. 첫번째 Observable에 onComplete()이벤트가 발생해야 두번째 Observable 을 구독한다.


4.조건 연산자

: Observable의 흐름을 제어하는 역할을 한다. 

: amb()함수 

둘 중 어느 것이든 먼저 나오는 Observable을 채택한다. 여러 개의 Observable중에서 1개의 Observable을 선택하는데, 그 기준은 가장 먼저 데이터를 발행하는 Observable이다. 그 이후에 나머지 Observable에서 발행하는 데이터를 모두무시한다.

: takeUntil(other)함수

other Observale에서 데이터가 발행되기 전까지만 현재 Observable을 채택한다. 인자로 받은 Observable에서 어떤 값을 발행하면 현재 Observable의 데이터 발행을 중단하고 즉시 onComplete()이벤트를 발생한다. 즉 take()함수처럼 일정 개수만 값을 발행하되 완료 기준은 다른 Observable에서 값을 발행하는지로 판단하는것이다.

: skipUntil(other)함수

other Observable에서 데이터가 발행될때까지는 현재 Observable에서 발행하는 값을 무시한다. 

: all()함수

Observable에 입력되는 값이 모두 특정조건에 맞을때만 true를 발행한다.



참고 : RxJava프로그래밍 (리액티브 프로그래밍 기초부터 RxAndroid까지 한 번에)

'Development > Reactive' 카테고리의 다른 글

스케줄러  (0) 2018.07.28
리액티브 연산자1  (0) 2018.07.28
Observable 알고가기  (0) 2018.07.25
리액티브 프로그래밍 개념  (0) 2018.07.24