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 타입입니다.

즉, CompletableSingle<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과 달리
예상치 못한 경우를 대비해야 하기때문에 명시해주는것이 좋습니다. (사용자가 화면을 나간다던가 등..)