From 0b5b9fe97a8e7ebacf33b5f3738f0e4ddcddc81f Mon Sep 17 00:00:00 2001 From: Krunoslav Zaher Date: Sat, 12 Dec 2015 21:07:00 +0100 Subject: [PATCH] Adds `deferred` to `Driver` unit. --- RxCocoa/Common/CocoaUnits/Driver/Driver.swift | 33 +++++++++++++++++-- RxTests/RxSwiftTests/Tests/Driver+Test.swift | 21 +++++++++++- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/RxCocoa/Common/CocoaUnits/Driver/Driver.swift b/RxCocoa/Common/CocoaUnits/Driver/Driver.swift index f7e40ffd..951e18ff 100644 --- a/RxCocoa/Common/CocoaUnits/Driver/Driver.swift +++ b/RxCocoa/Common/CocoaUnits/Driver/Driver.swift @@ -115,7 +115,19 @@ public struct Drive { public static func just(element: E) -> Driver { return Driver(raw: RxSwift.just(element).subscribeOn(ConcurrentMainScheduler.sharedInstance)) } - + + /** + Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes. + + - parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence. + - returns: An observable sequence whose observers trigger an invocation of the given observable factory function. + */ + @warn_unused_result(message="http://git.io/rxs.uo") + public static func deferred(observableFactory: () -> Driver) + -> Driver { + return Driver(RxSwift.deferred { observableFactory().asObservable() }) + } + #else /** @@ -148,7 +160,19 @@ public struct Drive { public static func just(element: E) -> Driver { return Driver(raw: _just(element).subscribeOn(ConcurrentMainScheduler.sharedInstance)) } - + + /** + Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes. + + - parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence. + - returns: An observable sequence whose observers trigger an invocation of the given observable factory function. + */ + @warn_unused_result(message="http://git.io/rxs.uo") + public static func deferred(observableFactory: () -> Driver) + -> Driver { + return Driver(_deferred { observableFactory().asObservable() }) + } + #endif @warn_unused_result(message="http://git.io/rxs.uo") @@ -174,5 +198,10 @@ func _never() -> Observable { func _just(element: E) -> Observable { return just(element) } + +func _deferred(observableFactory: () -> Observable) + -> Observable { + return deferred(observableFactory) +} #endif diff --git a/RxTests/RxSwiftTests/Tests/Driver+Test.swift b/RxTests/RxSwiftTests/Tests/Driver+Test.swift index 15c07db7..b4006144 100644 --- a/RxTests/RxSwiftTests/Tests/Driver+Test.swift +++ b/RxTests/RxSwiftTests/Tests/Driver+Test.swift @@ -293,6 +293,26 @@ extension DriverTest { } } +// MARK: deferred +extension DriverTest { + func testAsDriver_deferred() { + let hotObservable = BackgroundThreadPrimitiveHotObservable() + let driver = Drive.deferred { hotObservable.asDriver(onErrorJustReturn: -1) } + + let results = subscribeTwiceOnBackgroundSchedulerAndOnlyOneSubscription(driver) { + XCTAssertTrue(hotObservable.subscriptions == [SubscribedToHotObservable]) + + hotObservable.on(.Next(1)) + hotObservable.on(.Next(2)) + hotObservable.on(.Error(testError)) + + XCTAssertTrue(hotObservable.subscriptions == [UnsunscribedFromHotObservable]) + } + + XCTAssertEqual(results, [1, 2, -1]) + } +} + // MARK: map extension DriverTest { func testAsDriver_map() { @@ -314,7 +334,6 @@ extension DriverTest { XCTAssertEqual(results, [2, 3, 0]) } - } // MARK: filter