[RxSwift] Operators - empty, never, throw
👨🏻‍💻iOS 공부/RxSwift

[RxSwift] Operators - empty, never, throw

728x90
반응형

Creating에 속하는 empty, never, throw에 대해 알아볼 것이다. 

 

Empty

1. 정의 

empty는 아무 것도 emit하지 않는 옵저버블을 생성하지만 정상적으로 종료시킨다. 

 

Empty

즉, 그냥 빈 값으로 종료만 시키는 것!

2. 구현부

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

final private class EmptyProducer<Element>: Producer<Element> {
    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {
        observer.on(.completed)
        return Disposables.create()
    }
}

EmptyProducer에서 보면 onCompleted 처리를 해주고 있는 것을 볼 수 있다. 

 

3. 사용 예시

let observable = Observable<Void>.empty()

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

 

즉시 종료되는 옵저버블을 반환하고 싶을 때나, 의도적으로 빈 값을 내뱉도록 하고 싶을 때 사용할 수 있다. 

 

 

Never

1. 정의

never은 아무것도 emit하지 않고 종료되지도 않는다. 즉, 무한한 상태이다!

Never

스트림에 아무런 표시가 없는 걸 볼 수 있다.

2. 구현부

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

final private class NeverProducer<Element>: Producer<Element> {
    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {
        Disposables.create()
    }
}

 

empty와 달리 구현부에 onCompleted가 구현되지 않은 것을 볼 수 있다. 

3. 사용 예시

let observable = Observable<Any>.never()

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

// 아무 것도 반환X

이를 subscribe하면 onNext나 onCompleted는 반환(emit)되지 않는다!

 

 

Error

1. 정의

아무것도 emit하지 않고 단일 에러(.error) 이벤트와 함께 종료된다.

(문서에는 throw라고 되어있지만 RxSwift에서는 error가 이에 대응하는 것 같다!) 

Error

스트림에 에러말고는 보이는게 없다!

2. 구현부

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

final private class ErrorProducer<Element>: Producer<Element> {
    private let error: Swift.Error
    
    init(error: Swift.Error) {
        self.error = error
    }
    
    override func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {
        observer.on(.error(self.error))
        return Disposables.create()
    }
}

onError만 처리하고 있는 것을 볼 수 있다!

 

3. 사용 예시

enum CustomError: Error {
	case error
}

let observable = Observable<Void>.error(CustomError.error)

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

데이터 저장과 같은 과정의 실패를 설명하는데 유용하다. (URLSession에서 error 처리해주는 것과 비슷한 느낌!)


Ref : 

http://reactivex.io/documentation/operators/empty-never-throw.html

 

ReactiveX - Empty, Never, and Throw operators

RxGroovy implements these operators as empty, never, and error. The error operator takes as a parameter the Throwable with which you want the Observable to terminate. These operators do not operate by default on any particular Scheduler, but empty and erro

reactivex.io

https://www.stepintoswift.com/rxswift-operator-error

 

What is the Error Operator in RxSwift?

Error Operator

www.stepintoswift.com

 

728x90
반응형