본문 바로가기
RxSwift

[RxSwift] Operators - 필터링(3)

by 고고 2021. 11. 19.

소스 Observable에서 선택적으로 항목을 배출하는 연산자들 - Debounce, Distinct, ElementAt, Filter, First, IgnoreElements, Sample, Skip, Take

 

안녕하세요 ◠‿◠ 고고입니다.

 

1. Debounce

  • Debounce — Observable의 시간 흐름이 지속되는 상태에서 다른 항목들은 배출하지 않고 특정 시간 마다 그 시점에 존재하는 항목 하나를 Observable로부터 배출한다

구현부

public func debounce(_ dueTime: RxTimeInterval, scheduler: SchedulerType)
        -> Observable<Element> {
            return Debounce(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler)
    }

 

- Throttle

public func throttle(_ dueTime: RxTimeInterval, latest: Bool = true, scheduler: SchedulerType)
        -> Observable<Element> {
        Throttle(source: self.asObservable(), dueTime: dueTime, latest: latest, scheduler: scheduler)
    }

 

debounce vs throttle 참고 링크 : [RxSwift] 5. throttle, debounce

 

2. Distinct

  • Distinct — Observable이 배출하는 항목들 중 중복을 제거한 항목들을 배출한다

구현부

public func distinctUntilChanged()
        -> Observable<Element> {
        self.distinctUntilChanged({ $0 }, comparer: { ($0 == $1) })
    }

예시

let test = ["a","a","b","c","c","c"]

let source = Observable.from(test).distinctUntilChanged()

source.subscribe{ print($0) }

// next(a)
// next(b)
// next(c)
// completed

 

3. ElementAt

  • ElementAt — Obserable에서 n번째 항목만 배출한다

구현부

public func element(at index: Int)
        -> Observable<Element> {
        ElementAt(source: self.asObservable(), index: index, throwOnEmpty: true)
    }

예시

let test = ["a","a","b","c","c","c"]

let source = Observable.from(test).element(at: 2)

source.subscribe{ print($0) }

// next(b)
// completed

 

4. Filter

  • Filter — 테스트 조건을 만족하는 항목들만 배출한다

구현부

public func filter(_ predicate: @escaping (Element) throws -> Bool)
        -> Observable<Element> {
        Filter(source: self.asObservable(), predicate: predicate)
    }

예시

let test = ["a","a","b","c","c","c"]

let source = Observable.from(test).filter { $0 == "a" }

source.subscribe{ print($0) }

// next(a)
// next(a)
// completed

 

5. First

  • First — 맨 첫 번째 항목 또는 조건을 만족하는 첫 번째 항목만 배출한다

구현부

public func first() -> Single<Element?> {
        PrimitiveSequence(raw: First(source: self.asObservable()))
    }

 

6. IgnoreElements

  • IgnoreElements — 항목들을 배출하지는 않고 종료 알림은 보낸다

구현부

public func ignoreElements()
        -> Observable<Never> {
        self.flatMap { _ in Observable<Never>.empty() }
    }

 

7. Sample

  • Sample — 특정 시간 간격으로 최근에 Observable이 배출한 항목들을 배출한다

구현부

public func sample<Source: ObservableType>(_ sampler: Source, defaultValue: Element? = nil)
        -> Observable<Element> {
            return Sample(source: self.asObservable(), sampler: sampler.asObservable(), defaultValue: defaultValue)
    }

예시

let source = Observable<Int>.interval(0.1, scheduler: MainScheduler.instance)

source
	.sample(Observable<Int>.interval(0.5, scheduler: MainScheduler.instance))
	.subscribe{ print($0) }
    
// next(4)
// next(9)
// next(14)
// next(19)
// next(24)

 

8. Skip

  • Skip — Observable이 배출한 처음 n개의 항목들을 숨긴다

구현부

public func skip(_ count: Int)
        -> Observable<Element> {
        SkipCount(source: self.asObservable(), count: count)
    }

예시

let test = ["a","a","b","c","c","c"]

let source = Observable.from(test).skip(2)

source.subscribe{ print($0) }

// next(b)
// next(c)
// next(c)
// next(c)
// completed

 

- skipWhile

구현부

public func skip(while predicate: @escaping (Element) throws -> Bool) -> Observable<Element> {
        SkipWhile(source: self.asObservable(), predicate: predicate)
    }

예시

let test = ["a","a","b","c","c","c"]

let source = Observable.from(test).skip { $0 != "c" }

source.subscribe{ print($0) }

// next(c)
// next(c)
// next(c)
// completed

 

- skipUntil

구현부

public func skip<Source: ObservableType>(until other: Source)
        -> Observable<Element> {
        SkipUntil(source: self.asObservable(), other: other.asObservable())
    }

예시

let source = Observable<Int>.interval(0.1, scheduler: MainScheduler.instance)

source
	.skipUntil(Observable<Int>.interval(0.5, scheduler: MainScheduler.instance))
	.subscribe{ print($0) }
    
// next(5)
// next(6)
// next(7)
// next(8)
// ...

 

9. Take

  • Take — Observable이 배츨한 처음 n개의 항목들만 배출한다

구현부

public func take(_ count: Int)
        -> Observable<Element> {
        if count == 0 {
            return Observable.empty()
        }
        else {
            return TakeCount(source: self.asObservable(), count: count)
        }
    }

예시

let test = ["a","a","b","c","c","c"]

let source = Observable.from(test).take(2)

source.subscribe{ print($0) }

// next(a)
// next(a)
// completed

 

- take with duration

구현부

public func take(for duration: RxTimeInterval, scheduler: SchedulerType)
        -> Observable<Element> {
        TakeTime(source: self.asObservable(), duration: duration, scheduler: scheduler)
    }

예시

let source = Observable<Int>.interval(0.1, scheduler: MainScheduler.instance)

source
	.take(0.3, scheduler: MainScheduler.instance)
	.subscribe{ print($0) }
    
// next(0)
// next(1)
// completed

 

 

- takeLast

구현부

public func takeLast(_ count: Int)
        -> Observable<Element> {
        TakeLast(source: self.asObservable(), count: count)
    }

예시

let test = ["a","a","b","c","c","c"]

let source = Observable.from(test).takeLast(2)

source.subscribe{ print($0) }

// next(c)
// next(c)
// completed

 

 

출처 : http://reactivex.io/documentation/ko/operators.html

 

ReactiveX - Operators

연산자 소개 ReactiveX를 지원하는 언어 별 구현체들은 다양한 연산자들을 제공하는데, 이 중에는 공통적으로 제공되는 연산자도 있지만 반대로 특정 구현체에서만 제공하는 연산자들도 존재한다

reactivex.io

 

'RxSwift' 카테고리의 다른 글

[RxSwift] Operators - 유틸리티(6)  (0) 2021.11.29
[RxSwift] Operators - 오류 처리(5)  (0) 2021.11.20
[RxSwift] Operators - 결합(4)  (0) 2021.11.20
[RxSwift] Operators - 변환(2)  (0) 2021.11.19
[RxSwift] Opeators - 생성(1)  (0) 2021.11.19

댓글