[RxSwift] Traits: Single

임주희·2022년 12월 1일
0

RxSwift

목록 보기
4/5

Single

Single은 Observable과 비슷하지만 단 하나의 값 (또는 오류)만을 방출하는 시퀀스

Observable의 알림에 응답하는 데 사용하는 세 가지 방법( onNext , onError 및 onCompleted )으로 Single을 구독하는 대신 다음 두 가지 방법만 구독에 사용합니다.

Observable과 Single의 방출하는 이벤트들을 비교해보면
Observable

Observable<String>.just("😇")
    .subscribe(
        onNext: {_ in },
        onError: {_ in },
        onCompleted: {},
        onDisposed: {}
    )

Single

Single<String>.just("😇")
    .subscribe(
        onSuccess: {_ in },
        onFailure: {_ in },
        onDisposed: {})

onNext, onCompleted 대신 onSuccess가,
onError 대신 onFailure가 있음을 확인할 수 있다.

Observable처럼 onNext()로 일련의 무수한 값을 방출하는 대신
Single은 Success, Error를 한번만 방출 후 종료된다.
즉, "onSuccess == onNext + onCompleted"으로 이벤트 방출 후 바로 종료된다.

단순히 하나의 이벤트를 발생시키고 종료되는 곳에는 불필요하게 계속해서 발생할 여지가 있는 onNext가 존재하는 Observable 보다 Single을 사용할 수 있다. 예를 들어, 네트워킹 파싱 결과 처럼 <성공, 실패> 두가지만 있는 경우나 사진 저장 같은 작업에서 저장 성공, 실패(error) 둘 중 한가지만 방출하는 경우에 적합하다.

Single<String>
    .create(subscribe: { single in
        single(.success("😇"))
        return Disposables.create()
    }).subscribe(
            onSuccess: {
                print("Success: \($0)")
            },
            onFailure: {
                print("Error: \($0.localizedDescription)")
            },
            onDisposed: {
                print("Disposed")
            }
    ).dispose()

출력

Success: 😇
Disposed

.asSingle()

원시 Observable 시퀀스를 사용하여 Single로 변환하는 것도 가능하다.

Observable<String>
    .create { observer -> Disposable in
        observer.onNext("🐶")
        observer.onCompleted()
        return Disposables.create()
    }
    .asSingle()
    .subscribe(
            onSuccess: {
                print("Success: \($0)")
            },
            onFailure: {
                print("Error: \($0.localizedDescription)")
            },
            onDisposed: {
                print("Disposed")
            }
    ).dispose()

출력

Success: 🐶
Disposed

🚫주의🚫
Single의 이벤트인 success가 next, completed 두 개의 성격을 다 포함하고 있기 때문에, completed 이벤트가 발행되었을 때 이전에 next 이벤트가 들어오지 않으면 에러가 발생한다.

Observable<String>
    .create { observer -> Disposable in
        //observer.onNext("🐶") 
        observer.onCompleted()
        return Disposables.create()
    }
    .asSingle()
    .subscribe(
            onSuccess: {
                print("Success: \($0)")
            },
            onFailure: {
                print("error: \($0.localizedDescription)")
            },
            onDisposed: {
                print("Disposed")
            }
    ).dispose()

출력

error: The operation couldn’t be completed. (RxSwift.RxError error 4.)
Disposed


[출처] reactivex.io
[출처] ReactiveX/RxSwift: Reactive Programming in Swift - GitHub

0개의 댓글