본문 바로가기
IOS🍎/RxSwift

[RxSwift] Traits 이란

by Jouureee 2022. 3. 19.

  • Single, Maybe, Completable라는 세 가지 Trait이 있습니다.

 

Single

Observable의 변형으로 일련의 요소를 방출하는대신 항상 단일 요소 또는 오류를 방출하도록 합니다.

Single을 사용하는 일반적인 예는 URLSession에 response로의 .success, .error을 방출하는데 사용됩니다.

 

Single 생성하기

func getRepo(_ repo: String) -> Single<[String: Any]> {
    return Single<[String: Any]>.create { single in
        let task = URLSession.shared.dataTask(with: URL(string: "https://api.github.com/repos/\(repo)")!) { data, _, error in
            if let error = error {
                single(.error(error))
                return
            }

            guard let data = data,
                  let json = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves),
                  let result = json as? [String: Any] else {
                single(.error(DataError.cantParseJSON))
                return
            }

            single(.success(result))
        }

        task.resume()

        return Disposables.create { task.cancel() }
    }
}

그리고 getRepo 함수를 실행할때 아래와 같이 사용합니다.

 

getRepo("ReactiveX/RxSwift")
    .subscribe { event in
        switch event {
            case .success(let json):
                print("JSON: ", json)
            case .error(let error):
                print("Error: ", error)
        }
    }
    .disposed(by: disposeBag)

single은 항상 .success와 .error만 방출하도록 보장하는데요.

또한 asSingle <-> asObservable로 Observable과 Single 형으로 서로 변환이 가능합니다.

 

 

Completable

.completed 또는 .error만을 방출합니다. 그외의 어떤 값도 방출하지 않음을 보장합니다.

완료에 따른 요소에 신경쓰지 않은 경우 사용하면 유용합니다.

 

Completable 생성하기

func cacheLocally() -> 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 {}
    }
}

그리고 아래와 같이 사용합니다.

 

cacheLocally()
    .subscribe { completable in
        switch completable {
            case .completed:
                print("Completed with no error")
            case .error(let error):
                print("Completed with an error: \(error.localizedDescription)")
        }
    }
    .disposed(by: disposeBag)

이와 같이 Complete는 어떤 작업이 성공(complete) 했는가 여부를 확인할때 유용하게 사용합니다.

 

Maybe

Single와 Complete를 섞어놓은 것입니다.

단일 요소 값, .Complete, .error 중 하나를 방출합니다.

 

Maybe 생성하기

func generateString() -> Maybe<String> {
    return Maybe<String>.create { maybe in
        maybe(.success("RxSwift"))

        // OR

        maybe(.completed)

        // OR

        maybe(.error(error))

        return Disposables.create {}
    }
}

그리고 아래와 같이 사용합니다.

 

generateString()
    .subscribe { maybe in
        switch maybe {
            case .success(let element):
                print("Completed with element \(element)")
            case .completed:
                print("Completed with no element")
            case .error(let error):
                print("Completed with an error \(error.localizedDescription)")
        }
    }
    .disposed(by: disposeBag)

Single과 마찬가지로 Observable과 상호 변환이 가능합니다. .asMaybe() <-> asObservable()

 

참고 :

https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Traits.md

 

GitHub - ReactiveX/RxSwift: Reactive Programming in Swift

Reactive Programming in Swift. Contribute to ReactiveX/RxSwift development by creating an account on GitHub.

github.com

 

댓글