- 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
'IOS🍎 > RxSwift' 카테고리의 다른 글
[RxSwift] Signal, ControlProperty, ControlEvent 란 ? (0) | 2022.03.21 |
---|---|
[RxSwift] Driver란 ? (feat. bind) (0) | 2022.03.21 |
[RxSwift] Disposable DisposeBag 이란 (0) | 2022.03.17 |
[RxSwift] Combine Operator(CombineLatest, Merge, StartWith, Concat, Zip, WithLastFrom, Sample, SwitchLatest, Debounce) (0) | 2022.03.06 |
[RxSwift] 2. Subject와 Relay (0) | 2021.11.20 |
댓글