diff --git a/Sources/Operators/RetryWhen.swift b/Sources/Operators/RetryWhen.swift index 5fae26f..fecad33 100644 --- a/Sources/Operators/RetryWhen.swift +++ b/Sources/Operators/RetryWhen.swift @@ -44,7 +44,7 @@ extension Publishers.RetryWhen { class Subscription: Combine.Subscription where Downstream: Subscriber, Downstream.Input == Upstream.Output, Downstream.Failure == Upstream.Failure { private let upstream: Upstream private let downstream: Downstream - private let errorSubject = PassthroughSubject() + private let errorSubject = CurrentValueSubject(nil) private var sink: Sink? private var cancellable: AnyCancellable? @@ -64,7 +64,7 @@ extension Publishers.RetryWhen { return nil } ) - self.cancellable = errorTrigger(errorSubject.eraseToAnyPublisher()) + self.cancellable = errorTrigger(errorSubject.compactMap { $0 }.eraseToAnyPublisher()) .sink( receiveCompletion: { [sink] completion in switch completion { @@ -81,7 +81,6 @@ extension Publishers.RetryWhen { upstream.subscribe(sink) } ) - upstream.subscribe(sink!) } func request(_ demand: Subscribers.Demand) { diff --git a/Tests/RetryWhenTests.swift b/Tests/RetryWhenTests.swift index 3f3fc65..23ff40d 100644 --- a/Tests/RetryWhenTests.swift +++ b/Tests/RetryWhenTests.swift @@ -42,7 +42,7 @@ class RetryWhenTests: XCTestCase { func testSuccessfulRetry() { var times = 0 - + var retriesCount = 0 var expectedOutput: Int? var completion: Subscribers.Completion? @@ -57,7 +57,9 @@ class RetryWhenTests: XCTestCase { } }) .retryWhen { error in - error.map { _ in } + error + .handleEvents(receiveOutput: { _ in retriesCount += 1}) + .map { _ in } } .sink( receiveCompletion: { completion = $0 }, @@ -70,6 +72,7 @@ class RetryWhenTests: XCTestCase { ) XCTAssertEqual(completion, .finished) XCTAssertEqual(times, 2) + XCTAssertEqual(retriesCount, 1) } func testRetryFailure() {