ABOUT ME

iOS, Swift 개발 블로그입니다.

Today
Yesterday
Total
  • RxSwift - Trait
    Programming/RxSwift 2022. 3. 24. 21:07

     

    안녕하세요 BeePeach입니다 :)

     

    오늘은 Trait에 대해서 공부해보도록 하겠습니다.

     

    Trait는 이전에 우리가 공부한 기본적인 Observable보다 좀 더 특정된 기능에 집중한 Observable입니다.

    Trait들도 결국에는 Observable입니다. 그래서 Trait를 쓰는 코드에는 우리가 공부했던 Observable을 사용해도 아무런 문제가 없습니다.

     

    하지만 Trait를 사용하는 이유가 존재하겠죠?

    Trait를 이용하면 간편하고 직관적인 코드를 만들 수 있습니다.

     

    오늘은 RxSwift에서 제공하는 Trait에 대해서 공부해볼 예정입니다.

    그 이후 RxCocoa를 공부하고 난 뒤에 RxCocoa에서 제공하는 또 다른 여러 Trait를 살펴보도록 하겠습니다.

    일반적으로 RxSwift에서 제공하는 Trait보다 RxCocoa에서 제공하는 Trait를 더 많이 사용합니다.

     

    오늘은 RxSwift에서 제공하는 Trait가 있구나~ 정도만 알고 넘어가셔도 좋습니다.

     

    RxSwift에서 제공하는 Trait에는 3가지가 있습니다.

    • Single
    • Completable
    • Maybe

    그럼 각각에 대해 조금 더 자세히 살펴보도록 하겠습니다.

     

     


     

    Single

     

     

    Single은 success(value), failure(error) 이벤트를 방출합니다.

    둘 다 처음 보는 이벤트죠??

    success는 next와 completed가 결합된 이벤트입니다.

    그리고 failure는 error 이벤트와 같습니다.

     

    Trait는 Observable이라고 했는데... Observable에는 이런 이벤트는 없었잖아!라고 생각할 수 있습니다.

    이렇게 이벤트가 다른 이유는 코드를 보면 이해할 수 있습니다.

     

     

    Single의 타입메서드인 create 오퍼레이터를 확인해보면 우리가 이전에 사용하던 create 오퍼레이터와 다른 점이 보입니다.

    바로 클로저의 파라미터로 그냥 Observer가 아닌 SingleObserver를 받습니다.

     

    그럼 SingleObserver는 뭔지 궁금하니 찾아가보겠습니다.

     

     

    SingleObserver는 SingleEvent<Element> -> Void 의 typealias입니다.

    그럼 여기서 SingleEvent는 또 뭔데?? 한다면 바로 위에 적혀 있습니다.

    Result<Element, Swift.Error>의 typealias입니다.

     

    한마디로 Result Type이라는 겁니다.

     

    다시 생각해보니 success와 failure는 Result Type에서 봤던 친구들입니다.

    그럼 이제 이 이벤트들이 어떻게 되어있는지 확인해보겠습니다.

     

     

    success일 때는 next에 element들 담아 방출하고 completed 이벤트를 바로 방출합니다.

    즉 success는 성공한다면 데이터를 담아서 보내겠어! 라는 의미를 가집니다.

     

    그럼 failure라면? 그냥 실패하고 error를 담아서 보내겠어! 라는 의미입니다.

     

    정리해서 다시 말하자면 Single은 성공하거나 실패하거나 둘 중에 하나밖에 없습니다. 그리고 바로 종료됩니다.

    그래서 일회용 프로세스에 적합합니다.

     

    예를 들어 데이터 다운로딩이나 disk로부터 로딩하는 작업등이 있습니다.

     

     

     

     

    생성해보기

    Single<Int>.create { single in
    single(.success(2))
    // 이후의 코드는 전달되지 않습니다.
    // success는 completed를 호출한것과 같기 때문입니다.
    // single(.success(3))
    return Disposables.create()
    }.subscribe {
    print("Single >>>", $0)
    }.disposed(by: disposeBag)
    // Single >>> 2

    Observable에서 create 메서드를 사용한 것처럼 사용하면 됩니다.

    다른 점은 Observable에서는 on을 사용해서 이벤트를 전달했지만 Single에서는 on을 사용하지 않습니다.

    Single Observer는 SingleEvent<Element> -> Void 이므로 SingleEvent 즉, ResultType을 전달해야 합니다.

     

     

     


     

    Completable

     

     

    Completable은 completd, error(error) 이벤트를 방출합니다.

    어떻게 구현되어 있는지 코드를 확인해 보겠습니다.

     

     

    중요한 점은 completed라면 completed 이벤트를 전달하고

    error라면 error 이벤트를 전달한다는 점입니다.

     

    즉 next 이벤트가 없어서 데이터를 담아 보낼 수 없습니다.

    주로 File 읽기와 같은 성공, 실패 여부만을 확인할 때 사용합니다.

     

    Single과의 차이는 Single은 성공했다면 데이터를 담아 보낼 수 있고 Completable은 데이터를 담지 않고 성공, 실패만 따집니다.

    그리고 ResultType을 사용하지 않았습니다.

     

     

     

     

    생성해보기

    Completable.create { observer in
    // 성공이라면 completed
    observer(.completed)
    // 실패하면 error를 담아서
    observer(.error(MyError.error))
    return Disposables.create()
    }.subscribe(onCompleted: {
    print("Completable >>> complete")
    }).disposed(by: disposeBag)
    // Completable >>> complete

    CompletableObserver는 CompletableEvent -> Void 타입의 alias입니다.

    그래서 이벤트를 전달할 때 위 예시와 같이 전달하게 됩니다.

     

     


     

    Maybe

     

    Maybe는 Single과 Completable의 결합입니다.

    success(value), completed, error(Error) 이벤트를 방출합니다.

     

     

    코드를 보면 Single과 Completable을 섞은 것 같습니다.

    Single과는 다르게 ResultType이 아니라 Completable과 같이 enum으로 만들어진 Event를 방출합니다.

     

    대체적으로 completed와 error만을 보내는데 가끔 성공했을 때 데이터를 같이 보내야 하는 경우가 생긴다면 사용합니다.

     

     

    생성해보기

     

    Maybe<Int>.create { observer in
    observer(.success(2))
    // success이후에 전달되는 이벤트는 전달되지 않습니다.
    // single과 같은 이유입니다.
    // observer(.completed)
    // observer(.error(MyError.error))
    return Disposables.create()
    }.subscribe {
    print("Maybe >>>", $0)
    }.disposed(by: disposeBag)

    사용하는 방법은 Completable과 흡사합니다.

     

     


    참고 자료

     

    https://www.raywenderlich.com/books/rxswift-reactive-programming-with-swift

     

    RxSwift: Reactive Programming with Swift

    <p>Leverage the power of RxSwift in your reactive apps!</p> <p>This book is for iOS developers who already feel comfortable with iOS and Swift, and want to dive deep into development with RxSwift.</p> <p>Start with an introduction to the reactive programmi

    www.raywenderlich.com

     

     

    https://kxcoding.com

     

    여러분의 새로운 도전을 응원합니다 | KxCoding

    Mastering SwiftUI 더 적은 코드로, 더 멋진 UI 만들기

    kxcoding.com

     

     

     

     

    728x90

    'Programming > RxSwift' 카테고리의 다른 글

    RxSwift - Subject와 Relay  (0) 2022.03.25
    RxSwift - Observable factory  (0) 2022.03.21
    RxSwift - Disposable  (0) 2022.03.17
    RxSwift - Subscribe  (0) 2022.03.17
    RxSwift - Observable  (0) 2022.03.05
Designed by Tistory.