4.1 Filtering Observables

4.1.1 Debounce

정해진 RxTimeInterval 만큼 기다리는 동안 새로운 데이터가 전달되지 않으면 기다린 데이터를 전달하는 함수 입니다.

기다리는 동안 새로운 데이터가 들어오면 기다렸던 데이터는 전달하지 않고 새로운 데이터를 기다립니다.

let dispatchGroup = DispatchGroup()
dispatchGroup.enter()

Observable<Int>.timer(RxTimeInterval.milliseconds(0), period: RxTimeInterval.milliseconds(1000), scheduler: MainScheduler.instance)
    .debounce(RxTimeInterval.milliseconds(500), scheduler: MainScheduler.instance)
    .subscribe(onNext: {
        print("\\($0)")
    })

dispatchGroup.notify(queue: DispatchQueue.main) {
    exit(EXIT_SUCCESS)
}
dispatchMain()

// 0
// 1
// 2
// 3
// 4
// 5
// 6
// 7

4.1.2 Throttle

데이터를 전달하고 일정 시간만큼 들어오는 데이터를 무시하는 함수 입니다.

let dispatchGroup = DispatchGroup()
dispatchGroup.enter()

Observable<Int>.timer(RxTimeInterval.milliseconds(0), period: RxTimeInterval.milliseconds(1000), scheduler: MainScheduler.instance)
    .throttle(RxTimeInterval.milliseconds(2000), scheduler: MainScheduler.instance)
    .subscribe(onNext: {
        print("\\($0)")
    })

dispatchGroup.notify(queue: DispatchQueue.main) {
    exit(EXIT_SUCCESS)
}
dispatchMain()

// 0
// 2
// 4
// 6
// 8
// 10

4.1.3 Distinct

RxSwift에서는 distinctUntilChanged함수가 있는데 데이터가 달라지기 전까지 중복 데이터를 무시하는 함수 입니다.

Observable.of(1, 1, 2, 1, 2, 2, 3)
    .distinctUntilChanged()
    .subscribe(onNext: {
        print("\\($0)")
    })

// 1
// 2
// 1
// 2
// 3

4.1.4 ElementAt

해당 index의 데이터를 가져오는 함수 입니다.

elementAt함수는 deprecated이고 내부적으로 element(at:)을 호출 합니다.

Observable.of(1, 1, 2, 1, 2, 2, 3)
    .element(at: 3)
    .subscribe(onNext: {
        print("\\($0)")
    })

// 1

4.1.5 Filter

특정 조건에 충족하는 데이터만 전달하도록 하는 함수 입니다.

Observable.range(start: 0, count: 10)
    .filter {
        $0 % 2 == 0
    }
    .subscribe(onNext: {
        print("\\($0)")
    })

// 0
// 2
// 4
// 6
// 8

4.1.6 First