본문 바로가기
Swfit/RxSwift

RxSwift-Operator 종류 알아보기: Interval

by GGShin 2022. 11. 18.

RxSwift가 지원하는 Operator 중에서 Interval에 대해 알아보겠습니다.

Interval

Interval은 일정한 시간 간격을 두고 event를 방출하는 Observable을 생성하는 operator입니다. 원하는 시간 간격과 몇개의 event가 emit되도록 할 것인지 설정할 수 있습니다. 만약 emit될 event의 수를 명시하지 않으면 멈추지 않고 event가 emit되기 때문에 주의해야 합니다. 

어떻게 사용하는지 코드를 살펴보도록 하겠습니다.

 

 let observable = Observable<Int>
            .interval(.milliseconds(1000), scheduler: MainScheduler.instance)
            
 //observable의 type은 Observable<Int> 입니다.

 

Interval을 사용해서 Observable을 하나 생성해주었습니다. 처음에 이 부분에서 헷갈렸던 것이 Observable<Int> 부분이었습니다. 이렇게 되면 interval을 사용할 때 Int type만 Observable에서 방출하는 것인가 생각이 들었습니다. 

코드 snippet을 보면 Element라고 적혀있어서 String 등 다른 type도 들어갈 수 있어 보였는데, Int외의 타입을 넣으면 컴파일 에러가 발생했고, 다른 사용 예시들에서도 Int 타입만 사용하고 있어서 Int 형태만 사용할 수 있는 것 같았기 때문입니다. Source code를 살펴보니 일단 Element는 RxAbstractInteger에 한정되어 있다는 것을 확인할 수 있었습니다. 

그렇다면 방출도 Int만 하는가 했던 오해도 결론은 "그렇지는 않다"였습니다. map operator를 사용해서 원하는 대로 방출될 데이터를 바꾸어 주면 Int 뿐만 아니라 다른 type의 데이터도 방출할 수 있었습니다. 

 

      let observer = Observable<Int>
            .interval(.milliseconds(1000), scheduler: MainScheduler.instance)

        observer.subscribe{ print($0) }
            .disposed(by: disposeBag)
            
        //Prints
        //next(1)
        //next(2)
        //next(3)
        ...

위와 같은 코드는 숫자를 1초간격으로 1부터 n까지 무한정으로 print합니다. (제가 본 두 가지 정도의 예시에서는 이 정도로만 나와있다보니, interval이 마치 숫자를 1부터 n초 간격으로 방출하는 용도로만 사용되는 operator 처럼 보였던 것입니다 ㅎㅎ) 

 

만약에 숫자 대신에 "A"를 1초 간격으로 print하려면 어떻게 하면 될까요? 앞서 얘기했던 것과 같이 map operator를 써주면 됩니다. 

 

       let observer = Observable<Int>
            .interval(.milliseconds(1000), scheduler: MainScheduler.instance)
            .map{_ in "A"}
            
       //이 때 observer는 Observable<String> type입니다.

이렇게 하면 1초 간격으로 방출될 예정인 event(Int type)들이 "A"로 바뀌게 됩니다. 

이전과 동일하게 각 요소들을 print해보면,

       let observer = Observable<Int>
            .interval(.milliseconds(1000), scheduler: MainScheduler.instance)
            .map{_ in "A"}
            

        observer.subscribe{ print($0) }
            .disposed(by: disposeBag)
    
    
    //Prints 
    //next(A)
    //next(A)
    //next(A)
    //next(A)
    ...

subscribe를 하면서 observer가 $0을 print 한다는 내용을 동일하지만 방출된 event 자체가 String이 나온 것을 확인할 수 있습니다. 

 

아직은 사용이 좀 미숙하지만 조금씩 더 지식을 쌓아가면서 익숙해져야겠습니다 :)

 

유용한 내용이 있다면 추가하도록 하겠습니다.

감사합니다.

 


참고자료

https://reactivex.io/documentation/operators/interval.html

 

ReactiveX - Interval operator

RxGroovy implements this operator as interval. It accepts as its parameters a span of time to wait between emissions and the TimeUnit in which this span is measured. There is also a version of interval that returns an Observable that emits a single zero af

reactivex.io

 

https://brunch.co.kr/@tilltue/2

 

RxSwift, 시작하기

ReactiveX 기본 개념. | * 이 포스트는 RxSwift 4.3.1, Swift 4.2 버전을 기준으로 작성되었습니다. ReactiveX(http://reactivex.io/) 에서 소개하는 ReactiveX의 장점은 다음과 같다. "이벤트를 발생하는 Observable 과 이

brunch.co.kr

 

반응형

'Swfit > RxSwift' 카테고리의 다른 글

RxSwift와 RxCocoa의 차이점  (0) 2023.01.01
RxSwift란  (0) 2022.12.18
RxSwift-Observable, Subject, Relay 알아보기  (0) 2022.11.19