From fee2b0cf85c36985a0c855c7ef3f842773fbddfa Mon Sep 17 00:00:00 2001 From: Krunoslav Zaher Date: Thu, 13 Aug 2015 21:24:03 +0200 Subject: [PATCH] `trySend` to `?.on` and cleanup for `catch` --- RxCocoa/RxCocoa.xcodeproj/project.pbxproj | 2 +- .../Observables/Implementations/Catch.swift | 44 +++++++++---------- .../Observables/Observable+Multiple.swift | 10 ++--- .../Tests/Observable+MultipleTest.swift | 2 +- 4 files changed, 28 insertions(+), 30 deletions(-) diff --git a/RxCocoa/RxCocoa.xcodeproj/project.pbxproj b/RxCocoa/RxCocoa.xcodeproj/project.pbxproj index 80e97d20..2ff59094 100644 --- a/RxCocoa/RxCocoa.xcodeproj/project.pbxproj +++ b/RxCocoa/RxCocoa.xcodeproj/project.pbxproj @@ -153,7 +153,7 @@ C88BB8E31B07F2BE0064D411 /* UILabel+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UILabel+Rx.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; C88BB8E41B07F2BE0064D411 /* UIScrollView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UIScrollView+Rx.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; C88BB8E51B07F2BE0064D411 /* UISearchBar+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UISearchBar+Rx.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; - C88BB8E61B07F2BE0064D411 /* UITableView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UITableView+Rx.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + C88BB8E61B07F2BE0064D411 /* UITableView+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UITableView+Rx.swift"; sourceTree = ""; }; C88BB8E71B07F2BE0064D411 /* UITextField+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "UITextField+Rx.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; C88BB91B1B07FD830064D411 /* NSButton+Rx.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "NSButton+Rx.swift"; sourceTree = ""; }; C8A56BCD1AD744FD00B4673B /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; diff --git a/RxSwift/RxSwift/Observables/Implementations/Catch.swift b/RxSwift/RxSwift/Observables/Implementations/Catch.swift index e79e7205..62bc07a3 100644 --- a/RxSwift/RxSwift/Observables/Implementations/Catch.swift +++ b/RxSwift/RxSwift/Observables/Implementations/Catch.swift @@ -21,7 +21,7 @@ class CatchSinkProxy : ObserverType { } func on(event: Event) { - trySend(parent.observer, event) + parent.observer?.on(event) switch event { case .Next: @@ -56,31 +56,29 @@ class CatchSink : Sink, ObserverType { func on(event: Event) { switch event { case .Next: - trySend(observer, event) + observer?.on(event) case .Completed: - trySend(observer, event) + observer?.on(event) self.dispose() case .Error(let error): - parent.handler(error).recoverWith { error2 in - trySendError(observer, error2) - self.dispose() - return failure(error2) - }.flatMap { catchObservable -> RxResult in - let d = SingleAssignmentDisposable() - subscription.disposable = d - + do { + let catchSequence = try parent.handler(error) + let observer = CatchSinkProxy(parent: self) - let subscription2 = catchObservable.subscribeSafe(observer) - d.disposable = subscription2 - return SuccessResult + let subscription2 = catchSequence.subscribeSafe(observer) + subscription.disposable = subscription2 + } + catch let e { + observer?.on(.Error(e)) + self.dispose() } } } } class Catch : Producer { - typealias Handler = (ErrorType) -> RxResult> + typealias Handler = (ErrorType) throws -> Observable let source: Observable let handler: Handler @@ -118,13 +116,13 @@ class CatchToResultSink : Sink>>, Ob func on(event: Event) { switch event { case .Next(let value): - trySendNext(observer, success(value)) + observer?.on(.Next(success(value))) case .Completed: - trySendCompleted(observer) + observer?.on(.Completed) self.dispose() case .Error(let error): - trySendNext(observer, failure(error)) - trySendCompleted(observer) + observer?.on(.Next(failure(error))) + observer?.on(.Completed) self.dispose() } } @@ -159,22 +157,22 @@ class CatchSequenceSink : TailRecursiveSink { override func on(event: Event) { switch event { case .Next: - trySend(observer, event) + observer?.on(event) case .Error(let error): self.lastError = error self.scheduleMoveNext() case .Completed: - trySend(self.observer, event) + self.observer?.on(event) self.dispose() } } override func done() { if let lastError = self.lastError { - trySendError(observer, lastError) + observer?.on(.Error(lastError)) } else { - trySendCompleted(observer) + observer?.on(.Completed) } self.dispose() diff --git a/RxSwift/RxSwift/Observables/Observable+Multiple.swift b/RxSwift/RxSwift/Observables/Observable+Multiple.swift index a69d143b..e2e87909 100644 --- a/RxSwift/RxSwift/Observables/Observable+Multiple.swift +++ b/RxSwift/RxSwift/Observables/Observable+Multiple.swift @@ -46,20 +46,20 @@ extension ObservableType where E : ObservableType { // catch extension ObservableType { - public func catchErrorOrDie(handler: (ErrorType) -> RxResult>) + public func catchErrorOrDie(handler: (ErrorType) throws -> Observable) -> Observable { return Catch(source: self.normalize(), handler: handler) } public func catchError(handler: (ErrorType) -> Observable) -> Observable { - return Catch(source: self.normalize(), handler: { success(handler($0)) }) + return Catch(source: self.normalize(), handler: handler) } - // In case of error, terminates sequence with `replaceErrorWith`. - public func catchError(replaceErrorWith: E) + // In case of error sends `errorElementValue` and completes sequence + public func catchError(errorElementValue: E) -> Observable { - return Catch(source: self.normalize(), handler: { _ in success(just(replaceErrorWith)) }) + return Catch(source: self.normalize(), handler: { _ in just(errorElementValue) }) } // When error happens `error` will be forwarded as a next `Result` value diff --git a/RxTests/RxSwiftTests/Tests/Observable+MultipleTest.swift b/RxTests/RxSwiftTests/Tests/Observable+MultipleTest.swift index 8c1e0f0f..bd5adb47 100644 --- a/RxTests/RxSwiftTests/Tests/Observable+MultipleTest.swift +++ b/RxTests/RxSwiftTests/Tests/Observable+MultipleTest.swift @@ -79,7 +79,7 @@ extension ObservableMultipleTest { let res = scheduler.start { o1.catchErrorOrDie { e in handlerCalled = scheduler.clock - return failure(testError1) + throw testError1 } }