diff --git a/RxBlocking/BlockingObservable+Operators.swift b/RxBlocking/BlockingObservable+Operators.swift index d40f3a0d..b0a778e4 100644 --- a/RxBlocking/BlockingObservable+Operators.swift +++ b/RxBlocking/BlockingObservable+Operators.swift @@ -180,24 +180,25 @@ extension BlockingObservable { switch e { case .Next(let e): do { - if try error == nil && predicate(e) { - if element == nil { - element = e - } else { - error = RxError.MoreThanOneElement - } + if try !predicate(e) { + return + } + if element == nil { + element = e + } else { + throw RxError.MoreThanOneElement } } catch (let err) { error = err + d.dispose() + lock.stop() } return case .Error(let e): error = e lock.stop() case .Completed: - if error != nil { - break - } else if element == nil { + if error == nil && element == nil { error = RxError.NoElements } break diff --git a/RxTests/RxSwiftTests/Tests/Observable+BlockingTest.swift b/RxTests/RxSwiftTests/Tests/Observable+BlockingTest.swift index 55876d5a..0fd88c2c 100644 --- a/RxTests/RxSwiftTests/Tests/Observable+BlockingTest.swift +++ b/RxTests/RxSwiftTests/Tests/Observable+BlockingTest.swift @@ -225,7 +225,7 @@ extension ObservableBlockingTest { catch let e { XCTAssertTrue((e as! RxError)._code == RxError.MoreThanOneElement._code) } - XCTAssertEqual(predicateVals, [42, 43, 44]) + XCTAssertEqual(predicateVals, [42, 43, 44, 45]) } @@ -257,7 +257,7 @@ extension ObservableBlockingTest { catch let e { XCTAssertTrue(e as NSError === testError) } - XCTAssertEqual(predicateVals, [42, 43]) + XCTAssertEqual(predicateVals, [42, 43, 44, 45]) } func testSingle_predicate_fail() {