Skip to content

Commit f74657c

Browse files
committed
Merge branch 'TheAdamBorek-fix/1252_driver_scheduling' into develop
2 parents c7d9746 + 8e6d467 commit f74657c

File tree

3 files changed

+77
-6
lines changed

3 files changed

+77
-6
lines changed

RxCocoa/Traits/Driver/Driver.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
public typealias Driver<E> = SharedSequence<DriverSharingStrategy, E>
3838

3939
public struct DriverSharingStrategy: SharingStrategyProtocol {
40-
public static var scheduler: SchedulerType { return driverObserveOnScheduler }
40+
public static var scheduler: SchedulerType { return driverObserveOnScheduler() }
4141
public static func share<E>(_ source: Observable<E>) -> Observable<E> {
4242
return source.shareReplayLatestWhileConnected()
4343
}
@@ -58,12 +58,12 @@ extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingSt
5858
*/
5959
public func driveOnScheduler(_ scheduler: SchedulerType, action: () -> ()) {
6060
let originalObserveOnScheduler = driverObserveOnScheduler
61-
driverObserveOnScheduler = scheduler
61+
driverObserveOnScheduler = { return scheduler }
6262

6363
action()
6464

6565
// If you remove this line , compiler buggy optimizations will change behavior of this code
66-
_forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(driverObserveOnScheduler)
66+
_forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(scheduler)
6767
// Scary, I know
6868

6969
driverObserveOnScheduler = originalObserveOnScheduler
@@ -87,4 +87,4 @@ func _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(_ scheduler: Sche
8787
}
8888
}
8989

90-
fileprivate var driverObserveOnScheduler: SchedulerType = MainScheduler.instance
90+
fileprivate var driverObserveOnScheduler: () -> SchedulerType = { MainScheduler() }

Sources/AllTestz/main.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,8 @@ final class DriverTest_ : DriverTest, RxTestCase {
573573
("testDriverFromOptionalWhenNil", DriverTest.testDriverFromOptionalWhenNil),
574574
("testDriverFromSequence", DriverTest.testDriverFromSequence),
575575
("testDriverFromArray", DriverTest.testDriverFromArray),
576+
("testDrivingOrderOfSynchronousSubscriptions1", DriverTest.testDrivingOrderOfSynchronousSubscriptions1),
577+
("testDrivingOrderOfSynchronousSubscriptions2", DriverTest.testDrivingOrderOfSynchronousSubscriptions2),
576578
] }
577579
}
578580

Tests/RxCocoaTests/Driver+Test.swift

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,7 +1159,7 @@ extension DriverTest {
11591159

11601160
XCTAssertTrue(hotObservable1.subscriptions == [UnsunscribedFromHotObservable])
11611161
}
1162-
1162+
11631163
XCTAssertEqual(results, [2, -1])
11641164
}
11651165
}
@@ -1375,7 +1375,7 @@ extension DriverTest {
13751375
])
13761376
}
13771377
}
1378-
1378+
13791379
func testDriverFromArray() {
13801380
let scheduler = TestScheduler(initialClock: 0)
13811381

@@ -1388,3 +1388,72 @@ extension DriverTest {
13881388
}
13891389
}
13901390
}
1391+
1392+
// MARK: correct order of sync subscriptions
1393+
1394+
extension DriverTest {
1395+
func testDrivingOrderOfSynchronousSubscriptions1() {
1396+
func prepareSampleDriver(with item: String) -> Driver<String> {
1397+
return Observable.create { observer in
1398+
observer.onNext(item)
1399+
observer.onCompleted()
1400+
return Disposables.create()
1401+
}
1402+
.asDriver(onErrorJustReturn: "")
1403+
}
1404+
1405+
var disposeBag = DisposeBag()
1406+
let scheduler = TestScheduler(initialClock: 0)
1407+
let observer = scheduler.createObserver(String.self)
1408+
let variable = Variable("initial")
1409+
1410+
variable.asDriver()
1411+
.drive(observer)
1412+
.disposed(by: disposeBag)
1413+
1414+
prepareSampleDriver(with: "first")
1415+
.drive(variable)
1416+
.disposed(by: disposeBag)
1417+
1418+
prepareSampleDriver(with: "second")
1419+
.drive(variable)
1420+
.disposed(by: disposeBag)
1421+
1422+
Observable.just("third")
1423+
.bind(to: variable)
1424+
.disposed(by: disposeBag)
1425+
1426+
disposeBag = DisposeBag()
1427+
1428+
XCTAssertEqual(observer.events, [
1429+
next(0, "initial"),
1430+
next(0, "first"),
1431+
next(0, "second"),
1432+
next(0, "third")
1433+
])
1434+
1435+
}
1436+
1437+
func testDrivingOrderOfSynchronousSubscriptions2() {
1438+
var latestValue: Int?
1439+
let state = Variable(1)
1440+
_ = state.asDriver()
1441+
.flatMapLatest { x in
1442+
return Driver.just(x * 2)
1443+
}
1444+
.flatMapLatest { y in
1445+
return Observable.just(y).asDriver(onErrorJustReturn: -1)
1446+
}
1447+
.flatMapLatest { y in
1448+
return Observable.just(y).asDriver(onErrorDriveWith: Driver.empty())
1449+
}
1450+
.flatMapLatest { y in
1451+
return Observable.just(y).asDriver(onErrorRecover: { _ in Driver.empty() })
1452+
}
1453+
.drive(onNext: { element in
1454+
latestValue = element
1455+
})
1456+
1457+
XCTAssertEqual(latestValue, 2)
1458+
}
1459+
}

0 commit comments

Comments
 (0)