본문 바로가기
iOS/RxSwift

RxSwift. Traits가 뭘까? (Single, Maybe, Completable)

by 헤콩 2023. 2. 24.
반응형

RxSwift를 공부하던 중에 책에는 없는 내용인 Trait(Signle, Maybe, Completable)라는 게 있다는 것을 알게되었습니다. RxCocoa에도 Traits가 있지만 오늘은 일단 RxSwift의 Traits에 대해서 다뤄보려 합니다.

 

 

 

What is Traits?

Traits란 UI처리에 특화된 Observable이라고 할 수 있습니다. Traits는 직관적이고 작성하기 쉬운 코드를 작성하는데 도움이 되는 Observable로, 인터페이스 간 Observable이 소통하는 것을 도와주고 raw observable에 비해 문맥상 의미를 전달하거나 특정 용도로 사용하기에 좋습니다. 따라서 필수가 아닌 선택적으로 사용됩니다.

 

Single

  • 1개의 element를 포함하는 Observable Sequence
  • success(value) 이벤트 또는 error 이벤트한 번만 방출합니다.
  • success = next + completed 로 볼 수 있습니다.
  • 즉, success가 발생하면 single은 종료됩니다.
  • 파일 저장, 파일 다운로드, 디스크에서 데이터 로딩같이, 기본적으로 값을 산출하는 비동기적 모든 연산에도 유용합니다.
  • 사용 예시로, 응답/오류만 반환할 수 있는 HTTP 요청을 수행하는 데 사용되지만 단일요소를 사용하기 때문에 무한 스트림 요소가 아닌 단일 요소만 관리하는 경우에 사용할 수 있습니다.
  • 즉, 연속적인 원소를 방출하는 대신 하나의 원소나 에러를 방출하도록 보장된 Observable의 변형

 

Example of single with Alamofire

func request<T: BaseResponseModel>(
    _ url: Alamofire.URLConvertible,
    method: Alamofire.HTTPMethod,
    parameters: Alamofire.Parameters?,
    headers: Alamofire.HTTPHeaders?
) -> Single<T> {
    return Single<T>.create { (single) -> Disposable in
        let request = self.sendRequest(
            url, 
            method: method, 
            parameters: parameters, 
            headers: headers, 
            handler: { (result: Result<t>) in
                switch result {
                case .success(let value):
                    single(.success(value))
                case .failure(let error):
                    single(.error(error))
                }
            }
        )
        
        return Disposables.create { request.cancel() }
    }
}

 

 

Maybe

  • 0개 또는 1개의 element를 포함하는 Observable Sequence
  • Maybe는 Single과 유사하지만 아무런 값을 방출하지 않고 Complete되더라도 오류가 발생하지 않습니다.
  • success(value), completed, error 이벤트 3가지를 방출 할 수 있습니다.

 

Example of maybe

func maybe() -> Maybe<String> {
    return Maybe<String>.create { maybe in
        maybe(.success("RxSwift"))
        // or
        maybe(.completed)
        // or
        maybe(.error(error))
        
        return Disposables.create {}
    }
}


maybe().subscribe(
    onSuccess: { element in
        print("Completed with element \(element)")
    },
    onError: { error in
        print("Completed with an error \(error.localizedDescription)")
    },
    onCompleted: {
        print("Completed with no element")
    }
).disposed(by: disposeBag)

 

 

Completable

  • completed 이벤트 또는 error 이벤트를 방출합니다.
  • 어느 element도 방출하지 않고 에러나 완료만 가능한 Observable의 변형입니다.
  • 어떠한 operation의 성공적인 완료여부만 알고싶을 경우 사용할 수 있습니다. (예: 데이터 저장 성공여부)
  • Single, Maybe와 다르게 Observable을 Completable로 바꿀 수 없습니다.

 

Example of Completable

func completable() -> Completable {
    return Completable.create { completable in
        // Store some data locally
        
        guard success else {
            completable(.error(CacheError.failedCaching))
            return Disposables.create {}
        }
        
        completable(.completed)
        return Disposables.create {}
    }
}


completable().subscribe(
    onCompleted: {
        print("Completed with no error")
    },
    onError: { error in
        print("Completed with an error: \(error.localizedDescription)")
    }
).disposed(by: disposeBag)

 

 

 

 

 

 

 

 

 

 

 

 

Traits.md

GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

 

iOS. RxSwift Traits에 관하여 알아봅시다. 어렵지 않아요...

사전적인 의미로는 특성이라는 것으로 정의가 되어 있는데요. 쉽게 Rx의 흐름을 방출시킬수 있는 방법을 정의 하는 부분입니다. 가볍게 봐주셔도 됩니다. 거의 모든 분들은 그냥 Observable.create를

mrgamza.tistory.com

 

반응형

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

Ch7. Transforming Operators  (0) 2023.02.24
Ch5. Filtering Operators  (0) 2023.02.24
Ch3. Subjects  (0) 2023.02.24
Ch2. Observable  (0) 2023.02.24
Ch9. Combining Operators  (1) 2021.01.13

댓글