diff --git a/RxCocoa/Common/DelegateProxyType.swift b/RxCocoa/Common/DelegateProxyType.swift index 0ec4f2e6..5ca6fac9 100644 --- a/RxCocoa/Common/DelegateProxyType.swift +++ b/RxCocoa/Common/DelegateProxyType.swift @@ -332,7 +332,7 @@ extension DelegateProxyType where ParentObject: HasPrefetchDataSource, Self.Dele let subscription = self.asObservable() .observeOn(MainScheduler()) - .catchError { error in + .catch { error in bindingError(error) return Observable.empty() } diff --git a/RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift b/RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift index 96a53635..79913d70 100644 --- a/RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift +++ b/RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift @@ -33,7 +33,7 @@ extension ObservableConvertibleType { let source = self .asObservable() .observeOn(DriverSharingStrategy.scheduler) - .catchError { _ in + .catch { _ in onErrorDriveWith.asObservable() } return Driver(source) @@ -49,7 +49,7 @@ extension ObservableConvertibleType { let source = self .asObservable() .observeOn(DriverSharingStrategy.scheduler) - .catchError { error in + .catch { error in onErrorRecover(error).asObservable() } return Driver(source) diff --git a/RxCocoa/Traits/SharedSequence/ObservableConvertibleType+SharedSequence.swift b/RxCocoa/Traits/SharedSequence/ObservableConvertibleType+SharedSequence.swift index 57af194d..1b01b482 100644 --- a/RxCocoa/Traits/SharedSequence/ObservableConvertibleType+SharedSequence.swift +++ b/RxCocoa/Traits/SharedSequence/ObservableConvertibleType+SharedSequence.swift @@ -33,7 +33,7 @@ extension ObservableConvertibleType { let source = self .asObservable() .observeOn(S.scheduler) - .catchError { _ in + .catch { _ in onErrorDriveWith.asObservable() } return SharedSequence(source) @@ -49,7 +49,7 @@ extension ObservableConvertibleType { let source = self .asObservable() .observeOn(S.scheduler) - .catchError { error in + .catch { error in onErrorRecover(error).asObservable() } return SharedSequence(source) diff --git a/RxCocoa/Traits/Signal/ObservableConvertibleType+Signal.swift b/RxCocoa/Traits/Signal/ObservableConvertibleType+Signal.swift index 7af8f490..46d8de68 100644 --- a/RxCocoa/Traits/Signal/ObservableConvertibleType+Signal.swift +++ b/RxCocoa/Traits/Signal/ObservableConvertibleType+Signal.swift @@ -33,7 +33,7 @@ extension ObservableConvertibleType { let source = self .asObservable() .observeOn(SignalSharingStrategy.scheduler) - .catchError { _ in + .catch { _ in onErrorSignalWith.asObservable() } return Signal(source) @@ -49,7 +49,7 @@ extension ObservableConvertibleType { let source = self .asObservable() .observeOn(SignalSharingStrategy.scheduler) - .catchError { error in + .catch { error in onErrorRecover(error).asObservable() } return Signal(source) diff --git a/RxExample/RxExample/Services/ReachabilityService.swift b/RxExample/RxExample/Services/ReachabilityService.swift index fc3512a3..efcd714e 100644 --- a/RxExample/RxExample/Services/ReachabilityService.swift +++ b/RxExample/RxExample/Services/ReachabilityService.swift @@ -76,7 +76,7 @@ class DefaultReachabilityService extension ObservableConvertibleType { func retryOnBecomesReachable(_ valueOnFailure:Element, reachabilityService: ReachabilityService) -> Observable { return self.asObservable() - .catchError { (e) -> Observable in + .catch { e -> Observable in reachabilityService.reachability .skip(1) .filter { $0.reachable } diff --git a/RxSwift/Observables/Catch.swift b/RxSwift/Observables/Catch.swift index bc91b731..203b4d09 100644 --- a/RxSwift/Observables/Catch.swift +++ b/RxSwift/Observables/Catch.swift @@ -16,11 +16,25 @@ extension ObservableType { - parameter handler: Error handler function, producing another observable sequence. - returns: An observable sequence containing the source sequence's elements, followed by the elements produced by the handler's resulting observable sequence in case an error occurred. */ - public func catchError(_ handler: @escaping (Swift.Error) throws -> Observable) + public func `catch`(_ handler: @escaping (Swift.Error) throws -> Observable) -> Observable { Catch(source: self.asObservable(), handler: handler) } + /** + Continues an observable sequence that is terminated by an error with the observable sequence produced by the handler. + + - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html) + + - parameter handler: Error handler function, producing another observable sequence. + - returns: An observable sequence containing the source sequence's elements, followed by the elements produced by the handler's resulting observable sequence in case an error occurred. + */ + @available(*, deprecated, renamed: "catch(_:)") + public func catchError(_ handler: @escaping (Swift.Error) throws -> Observable) + -> Observable { + `catch`(handler) + } + /** Continues an observable sequence that is terminated by an error with a single element. @@ -44,7 +58,20 @@ extension ObservableType { - returns: An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully. */ + @available(*, deprecated, renamed: "catch(onSuccess:onFailure:onDisposed:)") public static func catchError(_ sequence: Sequence) -> Observable + where Sequence.Element == Observable { + `catch`(sequence: sequence) + } + + /** + Continues an observable sequence that is terminated by an error with the next observable sequence. + + - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html) + + - returns: An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully. + */ + public static func `catch`(sequence: Sequence) -> Observable where Sequence.Element == Observable { CatchSequence(sources: sequence) } diff --git a/RxSwift/Traits/Infallible/ObservableConvertibleType+Infallible.swift b/RxSwift/Traits/Infallible/ObservableConvertibleType+Infallible.swift index fd7f2da3..25e6a537 100644 --- a/RxSwift/Traits/Infallible/ObservableConvertibleType+Infallible.swift +++ b/RxSwift/Traits/Infallible/ObservableConvertibleType+Infallible.swift @@ -12,10 +12,10 @@ extension ObservableConvertibleType { } func asInfallible(onErrorFallbackTo infallible: Infallible) -> Infallible { - Infallible(self.asObservable().catchError { _ in infallible.asObservable() }) + Infallible(self.asObservable().catch { _ in infallible.asObservable() }) } func asInfallible(onErrorRecover: @escaping (Swift.Error) -> Infallible) -> Infallible { - Infallible(asObservable().catchError { onErrorRecover($0).asObservable() }) + Infallible(asObservable().catch { onErrorRecover($0).asObservable() }) } } diff --git a/RxSwift/Traits/PrimitiveSequence/PrimitiveSequence.swift b/RxSwift/Traits/PrimitiveSequence/PrimitiveSequence.swift index e57349d5..58d716b0 100644 --- a/RxSwift/Traits/PrimitiveSequence/PrimitiveSequence.swift +++ b/RxSwift/Traits/PrimitiveSequence/PrimitiveSequence.swift @@ -135,9 +135,23 @@ extension PrimitiveSequence { - parameter handler: Error handler function, producing another observable sequence. - returns: An observable sequence containing the source sequence's elements, followed by the elements produced by the handler's resulting observable sequence in case an error occurred. */ + @available(*, deprecated, renamed: "catch(_:)") public func catchError(_ handler: @escaping (Swift.Error) throws -> PrimitiveSequence) -> PrimitiveSequence { - PrimitiveSequence(raw: self.source.catchError { try handler($0).asObservable() }) + `catch`(handler) + } + + /** + Continues an observable sequence that is terminated by an error with the observable sequence produced by the handler. + + - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html) + + - parameter handler: Error handler function, producing another observable sequence. + - returns: An observable sequence containing the source sequence's elements, followed by the elements produced by the handler's resulting observable sequence in case an error occurred. + */ + public func `catch`(_ handler: @escaping (Swift.Error) throws -> PrimitiveSequence) + -> PrimitiveSequence { + PrimitiveSequence(raw: self.source.catch { try handler($0).asObservable() }) } /** diff --git a/Tests/RxSwiftTests/CompletableTest.swift b/Tests/RxSwiftTests/CompletableTest.swift index 6d71b266..e1fd74bb 100644 --- a/Tests/RxSwiftTests/CompletableTest.swift +++ b/Tests/RxSwiftTests/CompletableTest.swift @@ -272,7 +272,7 @@ extension CompletableTest { let scheduler = TestScheduler(initialClock: 0) let res = scheduler.start { - Completable.error(testError).catchError { _ in Completable.empty() } + Completable.error(testError).catch { _ in Completable.empty() } } XCTAssertEqual(res.events, [ @@ -286,7 +286,7 @@ extension CompletableTest { var isFirst = true let res = scheduler.start { Completable.error(testError) - .catchError { e in + .catch { e in defer { isFirst = false } @@ -310,7 +310,7 @@ extension CompletableTest { var isFirst = true let res = scheduler.start { Completable.error(testError) - .catchError { e in + .catch { e in defer { isFirst = false } @@ -336,7 +336,7 @@ extension CompletableTest { var isFirst = true let res = scheduler.start { Completable.error(testError) - .catchError { e in + .catch { e in defer { isFirst = false } diff --git a/Tests/RxSwiftTests/MaybeTest.swift b/Tests/RxSwiftTests/MaybeTest.swift index e8b7c45e..62849ff5 100644 --- a/Tests/RxSwiftTests/MaybeTest.swift +++ b/Tests/RxSwiftTests/MaybeTest.swift @@ -350,7 +350,7 @@ extension MaybeTest { let scheduler = TestScheduler(initialClock: 0) let res = scheduler.start { - Maybe.error(testError).catchError { _ in Maybe.just(2) } + Maybe.error(testError).catch { _ in Maybe.just(2) } } XCTAssertEqual(res.events, [ @@ -378,7 +378,7 @@ extension MaybeTest { var isFirst = true let res = scheduler.start { Maybe.error(testError) - .catchError { e in + .catch { e in defer { isFirst = false } @@ -403,7 +403,7 @@ extension MaybeTest { var isFirst = true let res = scheduler.start { Maybe.error(testError) - .catchError { e in + .catch { e in defer { isFirst = false } @@ -430,7 +430,7 @@ extension MaybeTest { var isFirst = true let res = scheduler.start { Maybe.error(testError) - .catchError { e in + .catch { e in defer { isFirst = false } diff --git a/Tests/RxSwiftTests/Observable+CatchTests.swift b/Tests/RxSwiftTests/Observable+CatchTests.swift index 62f34baf..15d2cc09 100644 --- a/Tests/RxSwiftTests/Observable+CatchTests.swift +++ b/Tests/RxSwiftTests/Observable+CatchTests.swift @@ -32,7 +32,7 @@ extension ObservableCatchTest { var handlerCalled: Int? let res = scheduler.start { - o1.catchError { _ in + o1.catch { _ in handlerCalled = scheduler.clock return o2.asObservable() } @@ -69,7 +69,7 @@ extension ObservableCatchTest { var handlerCalled: Int? let res = scheduler.start { - o1.catchError { _ in + o1.catch { _ in handlerCalled = scheduler.clock throw testError1 } @@ -90,15 +90,15 @@ extension ObservableCatchTest { #if TRACE_RESOURCES func testCatchReleasesResourcesOnComplete() { - _ = Observable.just(1).catchError { _ in Observable.just(1) }.subscribe() + _ = Observable.just(1).catch { _ in Observable.just(1) }.subscribe() } func tesCatch1ReleasesResourcesOnError() { - _ = Observable.error(testError).catchError { _ in Observable.just(1) }.subscribe() + _ = Observable.error(testError).catch { _ in Observable.just(1) }.subscribe() } func tesCatch2ReleasesResourcesOnError() { - _ = Observable.error(testError).catchError { _ in Observable.error(testError) }.subscribe() + _ = Observable.error(testError).catch { _ in Observable.error(testError) }.subscribe() } #endif } @@ -130,7 +130,7 @@ extension ObservableCatchTest { ]) let res = scheduler.start { - Observable.catchError([xs1.asObservable(), xs2.asObservable(), xs3.asObservable()]) + Observable.catch(sequence: [xs1.asObservable(), xs2.asObservable(), xs3.asObservable()]) } XCTAssertEqual(res.events, [ @@ -175,7 +175,7 @@ extension ObservableCatchTest { ]) let res = scheduler.start { - Observable.catchError([xs1, xs2].map { $0.asObservable() }) + Observable.catch(sequence: [xs1, xs2].map { $0.asObservable() }) } XCTAssertEqual(res.events, [ @@ -205,7 +205,7 @@ extension ObservableCatchTest { ]) let res = scheduler.start { - Observable.catchError([xs1, xs2].map { $0.asObservable() }) + Observable.catch(sequence: [xs1, xs2].map { $0.asObservable() }) } XCTAssertEqual(res.events, [ @@ -233,7 +233,7 @@ extension ObservableCatchTest { ]) let res = scheduler.start { - Observable.catchError([xs1, xs2].map { $0.asObservable() }) + Observable.catch(sequence: [xs1, xs2].map { $0.asObservable() }) } XCTAssertEqual(res.events, [ @@ -264,7 +264,7 @@ extension ObservableCatchTest { ]) let res = scheduler.start { - Observable.catchError([xs1, xs2].map { $0.asObservable() }) + Observable.catch(sequence: [xs1, xs2].map { $0.asObservable() }) } XCTAssertEqual(res.events, [ @@ -298,7 +298,7 @@ extension ObservableCatchTest { ]) let res = scheduler.start { - Observable.catchError([xs1, xs2].map { $0.asObservable() }) + Observable.catch(sequence: [xs1, xs2].map { $0.asObservable() }) } XCTAssertEqual(res.events, [ @@ -331,7 +331,7 @@ extension ObservableCatchTest { ]) let res = scheduler.start { - Observable.catchError([xs1, xs2].map { $0.asObservable() }) + Observable.catch(sequence: [xs1, xs2].map { $0.asObservable() }) } XCTAssertEqual(res.events, [ @@ -369,7 +369,7 @@ extension ObservableCatchTest { ]) let res = scheduler.start { - Observable.catchError([xs1.asObservable(), xs2.asObservable(), xs3.asObservable()]) + Observable.catch(sequence: [xs1.asObservable(), xs2.asObservable(), xs3.asObservable()]) } XCTAssertEqual(res.events, [ @@ -394,7 +394,7 @@ extension ObservableCatchTest { #if TRACE_RESOURCES func testCatchSequenceReleasesResourcesOnComplete() { - _ = Observable.catchError([Observable.just(1)]).subscribe() + _ = Observable.catch(sequence: [Observable.just(1)]).subscribe() } #endif } diff --git a/Tests/RxSwiftTests/SingleTest.swift b/Tests/RxSwiftTests/SingleTest.swift index 22013b75..c15cd233 100644 --- a/Tests/RxSwiftTests/SingleTest.swift +++ b/Tests/RxSwiftTests/SingleTest.swift @@ -287,7 +287,7 @@ extension SingleTest { let scheduler = TestScheduler(initialClock: 0) let res = scheduler.start { - Single.error(testError).catchError { _ in Single.just(2) } + Single.error(testError).catch { _ in Single.just(2) } } XCTAssertEqual(res.events, [ @@ -315,7 +315,7 @@ extension SingleTest { var isFirst = true let res = scheduler.start { (Single.error(testError) - .catchError { e in + .catch { e in defer { isFirst = false } @@ -341,7 +341,7 @@ extension SingleTest { var isFirst = true let res = scheduler.start { (Single.error(testError) - .catchError { e in + .catch { e in defer { isFirst = false } @@ -369,7 +369,7 @@ extension SingleTest { var isFirst = true let res = scheduler.start { (Single.error(testError) - .catchError { e in + .catch { e in defer { isFirst = false }