TIL
[RxSwift] Single<Void> 와 Completable
Kim Roks
2025. 3. 13. 22:16
✅ Single ?
Single은 하나의 값을 방출(success)하거나, 에러(error)를 방출하는 RxSwift의 Observable 타입입니다.
즉, Single<Void>는 "성공했지만 반환할 값이 따로 없다"는 의미를 가집니다.
예제
func test(email: String) -> Single<Void> {
return Single.create { single in
do {
let request = try testTarget.test(email: email).asURLRequest()
AF.request(request)
.validate(statusCode: 200..<300)
.response { response in
switch response.result {
case .success:
single(.success(())) // ✅ 성공 (Void 반환)
case .failure(let error):
single(.failure(error)) // ❌ 실패
}
}
return Disposables.create()
} catch {
return Single.error(error)
}
}
}
🧐 언제 사용할까?
✅ API 응답 값을 사용하지 않고 성공/실패 여부만 필요할 때
✅ onSuccess(Void)를 방출해야 하는 경우
하지만 굳이 Void 값을 반환할 필요가 없다면 Completable을 고려하는 게 더 적절할 수도 있습니다.
✅ Completable ?
Completable은 값을 방출하지 않고, 단순히 "완료(completed)" 또는 "에러(error)"만 방출하는 RxSwift의 Observable 타입입니다.
즉, Completable은 Single<Void>에서 Void 값조차 필요 없을 때 사용하는 타입입니다.
📌 예제
func test(email: String) -> Completable {
return Completable.create { completable in
do {
let request = try TestTarget.test(email: email).asURLRequest()
let task = AF.request(request)
.validate(statusCode: 200..<300)
.response { response in
switch response.result {
case .success:
completable(.completed) // ✅ 성공 (값 반환 없음)
case .failure(let error):
completable(.error(error)) // ❌ 실패
}
}
return Disposables.create { task.cancel() }
} catch {
return Completable.error(error)
}
}
}
🧐 언제 사용할까?
✅ 성공/실패 여부만 중요하고, 반환값이 필요 없을 때
✅ 특정 작업(예: 로그아웃, 캐시 삭제 등)을 수행한 후 완료 상태만 전달할 때
🔥 주의점
- completable 사용시엔 return Disposables.create { task.cancel() } 을 작성하게 되는데
이는 성공 실패 유무를 방출하고 즉시 종료되어 알아서 정리되는 Single과 달리
예상치 못한 경우를 대비해야 하기때문에 명시해주는것이 좋습니다. (사용자가 화면을 나간다던가 등..)