Single은 Observable과 비슷하지만 단 하나의 값 (또는 오류)만을 방출하는 시퀀스
Observable의 알림에 응답하는 데 사용하는 세 가지 방법( onNext , onError 및 onCompleted )으로 Single을 구독하는 대신 다음 두 가지 방법만 구독에 사용합니다.
Observable과 Single의 방출하는 이벤트들을 비교해보면
Observable
Observable<String>.just("😇")
.subscribe(
onNext: {_ in },
onError: {_ in },
onCompleted: {},
onDisposed: {}
)
Single
Single<String>.just("😇")
.subscribe(
onSuccess: {_ in },
onFailure: {_ in },
onDisposed: {})
onNext, onCompleted 대신 onSuccess가,
onError 대신 onFailure가 있음을 확인할 수 있다.
Observable처럼 onNext()로 일련의 무수한 값을 방출하는 대신
Single은 Success, Error를 한번만 방출 후 종료된다.
즉, "onSuccess == onNext + onCompleted"으로 이벤트 방출 후 바로 종료된다.
단순히 하나의 이벤트를 발생시키고 종료되는 곳에는 불필요하게 계속해서 발생할 여지가 있는 onNext가 존재하는 Observable 보다 Single을 사용할 수 있다. 예를 들어, 네트워킹 파싱 결과 처럼 <성공, 실패> 두가지만 있는 경우나 사진 저장 같은 작업에서 저장 성공, 실패(error) 둘 중 한가지만 방출하는 경우에 적합하다.
Single<String>
.create(subscribe: { single in
single(.success("😇"))
return Disposables.create()
}).subscribe(
onSuccess: {
print("Success: \($0)")
},
onFailure: {
print("Error: \($0.localizedDescription)")
},
onDisposed: {
print("Disposed")
}
).dispose()
출력
Success: 😇
Disposed
원시 Observable 시퀀스를 사용하여 Single로 변환하는 것도 가능하다.
Observable<String>
.create { observer -> Disposable in
observer.onNext("🐶")
observer.onCompleted()
return Disposables.create()
}
.asSingle()
.subscribe(
onSuccess: {
print("Success: \($0)")
},
onFailure: {
print("Error: \($0.localizedDescription)")
},
onDisposed: {
print("Disposed")
}
).dispose()
출력
Success: 🐶
Disposed
🚫주의🚫
Single의 이벤트인 success가 next, completed 두 개의 성격을 다 포함하고 있기 때문에, completed 이벤트가 발행되었을 때 이전에 next 이벤트가 들어오지 않으면 에러가 발생한다.
Observable<String>
.create { observer -> Disposable in
//observer.onNext("🐶")
observer.onCompleted()
return Disposables.create()
}
.asSingle()
.subscribe(
onSuccess: {
print("Success: \($0)")
},
onFailure: {
print("error: \($0.localizedDescription)")
},
onDisposed: {
print("Disposed")
}
).dispose()
출력
error: The operation couldn’t be completed. (RxSwift.RxError error 4.)
Disposed