본문 바로가기
iOS📱/RxSwift

[RxSwift] Traits ( Single, Maybe, Completable )

by 텅빈비니 2024. 1. 18.
반응형

안녕하세요🐶

빈지식 채우기의 비니🙋🏻‍♂️입니다.

 

오늘은 Traits에 대해 알아보도록 하겠습니다.


1. Traits 이란.

  • UI 처리에 특화된 Observable
  • 직관적이고 작성하기 쉬운 코드에 도움이 되는 Observable 
  • .asObservable 사용시 다시 기본 Observable로 돌아갈 수 있음.

2. Single

  • 1개의 요소를 포함하는 Observable
  • Success(value) 이벤트 또는 Error 이벤트한번만 방출합니다.
    • Success = Next + Completed 로 볼 수 있습니다.
    • 즉 Success 가 발생하면 해당 single 은 종료됩니다.
  • 즉 하나의 원소나 에러를 방출하도록 보장된 Observable 의 변형입니다.

 

Single<Int>.create { single in
    single(.success(219))	// 방출 O
    single(.success(1994))	// 방출 X
    return Disposables.create()
}.subscribe(
    onSuccess: {
        print("Success : \($0)")
    },
    onFailure: {
        print("Error : \($0.localizedDescription)")
    },
    onDisposed: {
        print("Disposed")
    }
).disposed(by: disposeBag)

  1. Int 219 와 1994, 2개의 값을 전달
  2. Single 이므로 219 만 방출 후 종료 

 

2-1. asSingle()

  • 기본 Observable 을 Single 로 변환이 가능하다.
Observable<Int>.create { observer in
    observer.onNext(219)
    observer.onCompleted()
    return Disposables.create()
}
.asSingle()
.subscribe(
    onSuccess: {
        print("Success : \($0)")
    },
    onFailure: {
        print("Error : \($0.localizedDescription)")
    },
    onDisposed: {
        print("Disposed")
    }
).disposed(by: disposeBag)

 

🚨주의 사항🚨

Single 이벤트인 Success 는 Next 와 Completed 성격을 다 포함하고 있기 때문에,

아래와 같이 Next 이벤트가 들어오지 않으면 에러를 발생한다.

Observable<Int>.create { observer in
//  observer.onNext(219)
    observer.onCompleted()
    return Disposables.create()
}
.asSingle()
.subscribe(
    onSuccess: {
        print("Success : \($0)")
    },
    onFailure: {
        print("Error : \($0.localizedDescription)")
    },
    onDisposed: {
        print("Disposed")
    }
).disposed(by: disposeBag)


3. Maybe

  • 0개 또는 1개의 요소를 포함하는 Observable
  • Maybe 는 Completed가 발생하였을 때 Next 값을 전달하지 않아도 에러가 발생하지 않습니다.
  • Success(value), Completed, Error 이벤트 3가지를 방출할 수 있습니다.

 

Maybe<Int>.create { maybe in
    maybe(.success(219))

    //OR

    maybe(.completed)

    //OR

    maybe(.error(error))

    return Disposables.create()
}.subscribe(
    onSuccess: {
        print("Success : \($0)")
    },
    onCompleted: {
        print("Completed")
    },
    onDisposed: {
        print("Disposed")
    }
).disposed(by: disposeBag)


4. Completable

  • Completed 이벤트 또는 error 이벤트를 방출합니다.
  • 어느 요소도 방출하지 않고 에러나 완료만 가능한 Observable 변형입니다.
  • Single, Maybe 와 다르게 Observable을 Completable 로 바꿀 수 없습니다.

Completable.create { completable in
	completable(.completed)
            
    //OR

    completable(.error(MyError.error))
    return Disposables.create()
}.subscribe(
    onCompleted: {
        print("Completed")
    },
    onError: {
        print("Error : \($0.localizedDescription)")
    },
    onDisposed: {
        print("Disposed")
    }
).disposed(by: disposeBag)

 

5. 정리

  Single Maybe Completable
특징 1. 1개의 요소를 포함
2. Success or Error 한번 방출
3. Success = Next + Completed
1. 0개 또는 1개 요소 포함 
2. Success, Completed, Error 3가지를 방출 가능
3. 아무런 값을 방출하지 않아도 Completed 가능
1. Completed, Error 2가지를 방출 가능
2. 어느 요소도 방출하지 않고 Completed 와 Error 만 가능
3. Observable 을 Completable로 변경 불가능
사용 예시 파일 저장, 파일 다운로드 등등   데이터 저장 성공 여부 확인

이상으로 Traits 에 대해 알아보았습니다.

전체 소스는 아래에 있습니다.

더보기

import Foundation

import RxSwift

import RxCocoa

 

class Traits {

 

    let disposeBag = DisposeBag()

    

    func singleTest() {

        

        print("----------------------------------------------------------")

        

        Single<Int>.create { single in

            single(.success(219))

            single(.success(1994))

            return Disposables.create()

        }.subscribe(

            onSuccess: {

                print("Success : \($0)")

            },

            onFailure: {

                print("Error : \($0.localizedDescription)")

            },

            onDisposed: {

                print("Disposed")

            }

        ).disposed(by: disposeBag)

        

        print("----------------------------------------------------------")

        

        Observable<Int>.create { observer in

//            observer.onNext(219)

            observer.onCompleted()

            return Disposables.create()

        }

        .asSingle()

        .subscribe(

            onSuccess: {

                print("Success : \($0)")

            },

            onFailure: {

                print("Error : \($0.localizedDescription)")

            },

            onDisposed: {

                print("Disposed")

            }

        ).disposed(by: disposeBag)

        

        print("----------------------------------------------------------")

        

    }

    

    func maybetest() {

        

        print("----------------------------------------------------------")

        

        Maybe<Int>.create { maybe in

            maybe(.success(219))

            

            //OR

            

//            maybe(.completed)

            

            //OR

            

//            maybe(.error(error))

            

            return Disposables.create()

        }.subscribe(

            onSuccess: {

                print("Success : \($0)")

            },

            onCompleted: {

                print("Completed")

            },

            onDisposed: {

                print("Disposed")

            }

        ).disposed(by: disposeBag)

        

        print("----------------------------------------------------------")

        

    }

 

    enum myError: Error {

    case error

    }

    

    func completableTest() {

        

        print("----------------------------------------------------------")

        

        Completable.create { completable in

            completable(.completed)

            

            //OR

            

            completable(.error(MyError.error))

            return Disposables.create()

        }.subscribe(

            onCompleted: {

                print("Completed")

            },

            onError: {

                print("Error : \($0.localizedDescription)")

            },

            onDisposed: {

                print("Disposed")

            }

        ).disposed(by: disposeBag)

        

        print("----------------------------------------------------------")

        

    }

    

}

 

다음 포스팅은 Share에 대해 알아보도록 하겠습니다.

감사합니다~~


참고

반응형

'iOS📱 > RxSwift' 카테고리의 다른 글

[RxSwift] Share(replay:)  (0) 2024.01.25
[RxSwift] Debounce, Throttle  (0) 2024.01.17
[RxCocoa] Driver  (0) 2024.01.17
[RxCocoa] Relay  (2) 2024.01.16
[ RXSwift ] Subject  (2) 2024.01.15