@@ -24,6 +24,8 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
24
24
25
25
private var nextId = 0
26
26
27
+ private let thread : Thread
28
+
27
29
/// - returns: Current time.
28
30
public var now : RxTime {
29
31
self . converter. convertFromVirtualTime ( self . clock)
@@ -41,6 +43,7 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
41
43
self . currentClock = initialClock
42
44
self . running = false
43
45
self . converter = converter
46
+ self . thread = Thread . current
44
47
self . schedulerQueue = PriorityQueue ( hasHigherPriority: {
45
48
switch converter. compareVirtualTime ( $0. time, $1. time) {
46
49
case . lessThan:
@@ -106,8 +109,7 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
106
109
- returns: The disposable object used to cancel the scheduled action (best effort).
107
110
*/
108
111
public func scheduleAbsoluteVirtual< StateType> ( _ state: StateType , time: VirtualTime , action: @escaping ( StateType ) -> Disposable ) -> Disposable {
109
- MainScheduler . ensureExecutingOnScheduler ( )
110
-
112
+ ensusreRunningOnCorrectThread ( )
111
113
let compositeDisposable = CompositeDisposable ( )
112
114
113
115
let item = VirtualSchedulerItem ( action: {
@@ -130,12 +132,11 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
130
132
131
133
/// Starts the virtual time scheduler.
132
134
public func start( ) {
133
- MainScheduler . ensureExecutingOnScheduler ( )
134
-
135
135
if self . running {
136
136
return
137
137
}
138
138
139
+ ensusreRunningOnCorrectThread ( )
139
140
self . running = true
140
141
repeat {
141
142
guard let next = self . findNext ( ) else {
@@ -170,12 +171,11 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
170
171
///
171
172
/// - parameter virtualTime: Absolute time to advance the scheduler's clock to.
172
173
public func advanceTo( _ virtualTime: VirtualTime ) {
173
- MainScheduler . ensureExecutingOnScheduler ( )
174
-
175
174
if self . running {
176
175
fatalError ( " Scheduler is already running " )
177
176
}
178
177
178
+ ensusreRunningOnCorrectThread ( )
179
179
self . running = true
180
180
repeat {
181
181
guard let next = self . findNext ( ) else {
@@ -199,8 +199,7 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
199
199
200
200
/// Advances the scheduler's clock by the specified relative time.
201
201
public func sleep( _ virtualInterval: VirtualTimeInterval ) {
202
- MainScheduler . ensureExecutingOnScheduler ( )
203
-
202
+ ensusreRunningOnCorrectThread ( )
204
203
let sleepTo = self . converter. offsetVirtualTime ( self . clock, offset: virtualInterval)
205
204
if self . converter. compareVirtualTime ( sleepTo, self . clock) . lessThen {
206
205
fatalError ( " Can't sleep to past. " )
@@ -211,8 +210,7 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
211
210
212
211
/// Stops the virtual time scheduler.
213
212
public func stop( ) {
214
- MainScheduler . ensureExecutingOnScheduler ( )
215
-
213
+ ensusreRunningOnCorrectThread ( )
216
214
self . running = false
217
215
}
218
216
@@ -221,6 +219,12 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
221
219
_ = Resources . decrementTotal ( )
222
220
}
223
221
#endif
222
+
223
+ private func ensusreRunningOnCorrectThread( ) {
224
+ guard Thread . current == thread else {
225
+ rxFatalError ( " Executing on the wrong thread. Please ensure all work on the same thread. " )
226
+ }
227
+ }
224
228
}
225
229
226
230
// MARK: description
0 commit comments