IOS/RxSwift
[RxSwift] Single,Maybe,Completable 알아보기
내일도이렇게
2022. 4. 12. 12:38
Single
success 또는 error 이벤트를 한 번만 방출될 수 있다.
var disposeBag = DisposeBag()
enum TraitsError: Error {
case single
case maybe
case completable
}
print("-------Single1-------") // 성공시
Single<Result<String, TraitsError>>.just(.success("✅"))
.subscribe(onSuccess: {
print($0)
}, onFailure: { _ in
print("error")
}, onDisposed: {
print("disposed")
})
.disposed(by: disposeBag)
print("-------Single2-------") // 실패시
Observable<Result<String, TraitsError>>.just(.failure(.single))
.asSingle()
.subscribe(onSuccess: {
print("success: \($0)")
}, onFailure: {
print("error: \($0.localizedDescription)")
}, onDisposed: {
print("disposed")
})
.disposed(by: disposeBag)
Single 를 이용한 decode 예제
print("------single------")
struct SomeJSON: Decodable {
let name: String
}
enum JSONError: Error {
case decodingError
}
let json1 = """
{"name":"hello"}
"""
func decode(json: String) -> Single<SomeJSON> {
Single<SomeJSON>.create { observer in
let disposable = Disposables.create()
guard let data = json.data(using: .utf8),
let json = try? JSONDecoder().decode(SomeJSON.self, from: data) else {
observer(.failure(JSONError.decodingError))
return disposable
}
observer(.success(json))
return disposable
}
}
decode(json: json1)
.subscribe{
switch $0 {
case .success(let json):
print(json.name)
case .failure(let error):
print(error)
}
}
.disposed(by: disposeBag)
------single------
hello
Completable
comleted 이벤트 또는 error 이벤트를 방출될 수 있다.
print("-------Completable-------")
Completable.create { completable in
completable(.completed)
return Disposables.create()
}
.subscribe(onCompleted: {
print("completed")
}, onError: {
print("error: \($0.localizedDescription)")
}, onDisposed: {
print("disposed")
})
.disposed(by: disposeBag)
-------Completable-------
completed
disposed
Maybe
success, completed , error 모두 방출될 수 있다.
print("-------Maybe1-------")
Maybe<Result<String, TraitsError>>.just(.success("✅"))
.subscribe(onSuccess: {
print("success: \($0)")
}, onError: {
print("error: \($0.localizedDescription)")
}, onCompleted: {
print("completed")
}, onDisposed: {
print("disposed")
})
.disposed(by: disposeBag)
-------Maybe1-------
success: success("✅")
disposed