본문 바로가기
RxSwift

[RxSwift] Opeators - 생성(1)

by 고고 2021. 11. 19.

새로운 Observable을 만드는 연산자들 - Create, Deffered, Empty, Never, error, from, interval, just, range, repeat, start, timer

 

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

1. Create

  • Create — 직접적인 코드 구현을 통해 옵저버 메서드를 호출하여 Observable을 생성한다

구현부

public static func create(_ subscribe: @escaping (AnyObserver<Element>) -> Disposable) -> Observable<Element> {
        AnonymousObservable(subscribe)
    }

예시:

let source : Observable = Observable.create { observer in
    for i in 1...5 {
        observer.on(.next(i))
    }
    observer.on(.completed)

    // Note that this is optional. If you require no cleanup you can return
    // `Disposables.create()` (which returns the `NopDisposable` singleton)
    return Disposables.create {
        print("disposed")
    }
}

source.subscribe {
    print($0)
}

// next(1)
// next(2)
// next(3)
// next(4)
// next(5)
// completed
// disposed

 

2. Deferred

  • Defer — 옵저버가 구독하기 전까지는 Observable 생성을 지연하고 구독이 시작되면 옵저버 별로 새로운 Observable을 생성한다

구현부

public static func deferred(_ observableFactory: @escaping () throws -> Observable<Element>)
        -> Observable<Element> {
        Deferred(observableFactory: observableFactory)
    }

예시:

var flag = true 

let observable: Observable<String> = Observable.deferred {
    flag.toggle()
    
    if flag {
        return Observable.from(["a", "a"])
    } else {
        return Observable.from(["b", "b"])
    }
}

observable
    .subscribe { print($0) }
    .disposed(by: disposeBag)

// a
// a
// completed

observable
    .subscribe { print($0) }
    .disposed(by: disposeBag)

// b
// b
// completed

 상태에 따라 다른 데이터를 처리해야할 필요가 있을 경우를 대처할 수 있습니다.

 

 

3. Empty / Never / Throw

empty : 항목은 없지만 정상적으로 종료되는 옵저버블 

구현부

public static func empty() -> Observable<Element> {
        EmptyProducer<Element>()
    }

예시

Observable<Void>.empty()
    .subscribe { print($0) }
    .disposed(by: disposeBag)
    
// completed

 

 

never : 항목을 방출하지 않고 종료하지 않는 옵저버블

구현부

public static func never() -> Observable<Element> {
        NeverProducer()
    }

예시

Observable<Void>.never()
    .subscribe { print($0) }
    .disposed(by: disposeBag)
    
// ...

 

Throw : 항목을 방출하지 않고 오류로 종료되는 옵저버블 

구현부

public static func error(_ error: Swift.Error) -> Observable<Element> {
        ErrorProducer(error: error)
    }

예시

enum MyError: Error {
    case error
}

Observable<Void>.error(MyError.error)
    .subscribe { print($0) }
    .disposed(by: disposeBag)
    
// error(error)
  • Empty/Never/Throw — 아주 정확하고 제한된 행동을 하는 Observable을 생성한다

 

4. From

  • From — 다른 객체나 자료 구조를 Observable로 변환한다

구현부

public static func from(_ array: [Element], scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element> {
        ObservableSequence(elements: array, scheduler: scheduler)
    }

예시

let numbers = [1,2,3,4,5]

let source = Observable.from(numbers)

source.subscribe {
    print($0)
}

// next(1)
// next(2)
// next(3)
// next(4)
// next(5)
// completed

 

 

5. Interval

  • Interval — 특정 시간별로 연속된 정수형을 배출하는 Observable을 생성한다

구현부

public static func interval(_ period: RxTimeInterval, scheduler: SchedulerType)
        -> Observable<Element> {
        return Timer(
            dueTime: period,
            period: period,
            scheduler: scheduler
        )
    }

예시

let source = Observable<Int>.interval(0.5, scheduler: MainScheduler.instance)
    
source.subscribe(onNext: { _ in 
    print("0.5초가 지났습니다")
})

// 0.5초마다 0.5초가 지났습니다 출력

 

 

6. Just

  • Just — 객체 하나 또는 객채집합을 Observable로 변환한다. 변환된 Observable은 원본 객체들을 발행한다

구현부

public static func just(_ element: Element) -> Observable<Element> {
        Just(element: element)
    }

예시

let source = Observable.just(1, 2, 3)

source.subscribe {
    print($0)
}

// next((1, 2, 3))
// completed

let source2 = Observable.just([1,2,3])

source2.subscribe {
    print($0)
}

// next([1, 2, 3])
// completed

 

7. Range

  • Range — 연속된 범위(Range)의 정수를 발행하는 Observable을 생성한다

구현부

public static func range(start: Element, count: Element, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element> {
        RangeProducer<Element>(start: start, count: count, scheduler: scheduler)
    }

예시

let source =  Observable.range(start: 1, count: 5)

source.subscribe {
    print($0)
}

// next(1)
// next(2)
// ...
// next(5)

 

 

8. Repeat

  • Repeat — 특정 항목이나 연속된 항목들을 반복적으로 배출하는 Observable을 생성한다

구현부

public static func repeatElement(_ element: Element, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<Element> {
        RepeatElement(element: element, scheduler: scheduler)
    }

예시

let source =  Observable.repeatElement("A")

source.subscribe {
    print($0)
}


// "A"
// ...
// 무한루프

 

 

9. Start

  • Start — 함수의 실행 결과를 배출하는 Observable을 생성한다

RxSwift에 없는 거 같습니다. (댓글 부탁드려요)

 

10.  Timer

  • Timer — 지정된 시간이 지나고 난 후 항목을 하나 배출하는 Observable을 생성한다

구현부

public static func timer(_ dueTime: RxTimeInterval, period: RxTimeInterval? = nil, scheduler: SchedulerType)
        -> Observable<Element> {
        return Timer(
            dueTime: dueTime,
            period: period,
            scheduler: scheduler
        )
    }

예시

let source =  Observable<Int>.timer(.seconds(1), scheduler: MainScheduler.instance)

source.subscribe {
    print($0)
}

// 1초 후
// next(0) 
// 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 - 필터링(3)  (0) 2021.11.19
[RxSwift] Operators - 변환(2)  (0) 2021.11.19

댓글