RxSwift - 알아보기Transforming Operator<Scan,Buffer>

JSLee·2022년 2월 16일
0

Scan

scan 은 매우 간단하다.

초기값(Seed)의 따라서 값이 변화를 감시합니다
이땐 증가할수도 있고 감소할수도 있습니다.

위 이미지를 통한 예제 코드를 작성해보자면

        Observable.of(1,2,3,4,5).scan(0) { x, y in
            return x + y
        }.subscribe(onNext: {
            print($0)
        }).disposed(by: disposeBag)
//print
1
3
6
10
15

만약 scan(5) 였다면??

Scan(5) -> 1 + 5 = 6 , 2 + 6 = 8 , 3 + 8 = 11 , 4 + 11 = 15 , 5 + 15 = 20

이렇게 적용되겠습니다!!

Buffer

Observable에 의해 방출된 항목을 주기적으로 번들로 수집하고 한 번에 하나씩 방출하는 대신 이러한 번들을 방출합니다.

이말은.. 그냥 방출된 Event를 Buffer로 묶어서 Observable 로 방출한다! 이런것 같네요.

Buffer Operator 를 사용하기 위해선 몇가지의 매개변수가 필요합니다.

public func buffer(
    timeSpan: RxTimeInterval, 
    count: Int, 
    scheduler: SchedulerType
    ) -> Observable<[Element]> {
    BufferTimeCount(
        source: self.asObservable(), 
        timeSpan: timeSpan, 
        count: count, 
        scheduler: scheduler
    )
}

timeSpan : 라이프사이클이 시작된 이후에 시퀀스들을 Buffer로 묶을 간격을 설정합니다.
timeSpan 이후에는 Buffer에 묶여있는 시퀀스를 방출하게 됩니다.

count : Buffer로 묶을수 있는 시퀀스의 최대 갯수를 설정합니다.
설정된 count 갯수만큼 충족되지 못하여도 timeSpan 간격에 맞춰 Buffer는 방출됩니다.

scheduler : Operator가 작동될 Thread를 설정 합니다.

기본 구현

        Observable<Int>
            .interval(.seconds(1), scheduler: MainScheduler.instance)
            .buffer(timeSpan: .seconds(3), count: 10, scheduler: MainScheduler.instance)
            .take(6)
            .subscribe {
                print($0)
            }.disposed(by: disposeBag)

위 코드를 통한 OutPut이 어떻게 되는지 한번 보겠습니다.!

2배속 입니다.

이런식으로 설정된 시간에 맞게 buffer에 시퀀스가 묶이며 방출되는것을 볼수 있습니다.

또한 여기서 알아볼수 있는것이 count 갯수를 아무리 10으로 설정하여도 timeSpan의 간격에 맞게
시퀀스는 방출됩니다.

profile
iOS/Android/FE/BE

0개의 댓글