본문 바로가기

gyub's 공부일기/RxJava

[RxJava] 생성 연산자 interval(), timer(), range(), intervalRange(), defer()

생성 연산자의 역할은 데이터 흐름을 만드는 것입니다. 간단하게 말해서 Observable(Observable, Single, Maybe 객체 등 )을 만든다고 생각하면 됩니다!

 

1. interval() 함수

interval() 함수는 일정 시간 간격으로 데이터 흐름을 생성합니다.

위 그림처럼 주어진 시간 간격으로 0부터 1씩 증가하는 Long 객체를 발행합니다

이러한 interval()함수의 두 개의 원형들만 일단 알아보겠습니다!

첫 번째 원형은 일정 시간 (period)를 쉬었다가 데이터를 발행합니다.

두 번째 원형은 동작은 같고 최초 지연 시간(initialDelay)을 조절할 수 있죠. 보통 초기 지연 시간없이 바로 데이터를 발행하기 위해 (initialDelay =0) 사용합니다.

 

여기서 다소 주의깊게 보실 점은 SchedulerSuppor 어노테이션입니다!

@SchedulerSupport(SchedulerSupport.COMPUTATION) 어노테이션은 interval() 함수의 동작이 계산 스케줄러에서 실행된다는 의미입니다. 즉, 현재 스레드가 아닌 계산을 위한 별도의 스레드에서 동작한다는 말이죠

 

interval() 함수는 기본적으로 영원히 지속 실행되기 때문에 폴링 방식의 용도로 많이 사용합니다

 

여기서 잠깐!!! 폴링이란?

"폴링(polling)이란 하나의 장치(또는 프로그램)이 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치(또는 프로그램)의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식을 말한다."

 

즉 현존 하는 대부분의 실시간 처럼 보이는 웹사이트 들은 클라이언트가 서버에게 일정한 주기를 가지고 응답을 주고받는 폴링 방식을 사용한다.

-from 위키피디아-

 

2. timer() 함수

timer()는 interval() 함수와 유사하지만 한 번만 실행되는 함수에요. 일정 시간이 지난 후에 한 개의 데이터를 발행하고 onComplete() 이벤트가 발생합니다.

 

 

interval()함수와 유사하죠!

이 timer()함수도 현재 스레드가 아닌 계산 스케줄러에서 실행되고 발행되는 데이터도 0L 부터 발행이 됩니다.

보통 일정 시간이 지난 후 어떤 동작을 실행할 때 활용합니다.

 

3. range() 함수

range() 함수는 말 그대로 어떤 범위를 가리키는데요. 주어진 값(n)부터 m개의 Integer 객체를 발행합니다.

 

range함수의 원형입니다! start가 n , count가 m이 되겠군요.

이제는 다들 아실테지만 이 range()함수는 현재 스레드에서 실행됩니다!

 

4. intervalRange() 함수

intervalRange() 함수는 interval()과 range()를 혼합해놓은 함수입니다! 즉 interval()함수처럼 무한히 데이터 흐름을 발행하지 않고 range() 함수처럼 일정 범위내에서 발행을 하죠! 리턴 타입은 Long입니다.

 

 

5. defer() 함수

defer() 함수는 timer() 함수와 비슷하지만 데이터 흐름 생성을 구독자가 subscribe()함수를 호출할 때까지 미룰 수 있습니다. 이때 새로운 Observable이 생성됩니다.

그림과 같이 Observable의 생성이 구독할 때까지 미뤄지기 때문에 최신 데이터를 얻을 수 있습니다!

즉, defer() 함수를 화룡하면 subscribe() 함수를 호출할 때의 상황을 반영하여 데이터 흐름의 생성을 지연하는 효과를 보여줍니다.

 

6. repeat() 함수

repeat() 함수는 딱히 설명을 안 해도 아시겠죠??? 맞습니다 반복 실행을 하는 애에요

왜 사용하죠? 서버와 통신을 할 때 해당 서버가 잘 살아있는지 확인할 때 필요하기 때문이에요

그림처럼 차례대로 반복하며 원을 계속 생성합니다

 

반응형