@@ -24,6 +24,8 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
2424
2525 private var nextId = 0
2626
27+ private let thread : Thread
28+
2729 /// - returns: Current time.
2830 public var now : RxTime {
2931 self . converter. convertFromVirtualTime ( self . clock)
@@ -41,6 +43,7 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
4143 self . currentClock = initialClock
4244 self . running = false
4345 self . converter = converter
46+ self . thread = Thread . current
4447 self . schedulerQueue = PriorityQueue ( hasHigherPriority: {
4548 switch converter. compareVirtualTime ( $0. time, $1. time) {
4649 case . lessThan:
@@ -106,8 +109,7 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
106109 - returns: The disposable object used to cancel the scheduled action (best effort).
107110 */
108111 public func scheduleAbsoluteVirtual< StateType> ( _ state: StateType , time: VirtualTime , action: @escaping ( StateType ) -> Disposable ) -> Disposable {
109- MainScheduler . ensureExecutingOnScheduler ( )
110-
112+ ensusreRunningOnCorrectThread ( )
111113 let compositeDisposable = CompositeDisposable ( )
112114
113115 let item = VirtualSchedulerItem ( action: {
@@ -130,12 +132,11 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
130132
131133 /// Starts the virtual time scheduler.
132134 public func start( ) {
133- MainScheduler . ensureExecutingOnScheduler ( )
134-
135135 if self . running {
136136 return
137137 }
138138
139+ ensusreRunningOnCorrectThread ( )
139140 self . running = true
140141 repeat {
141142 guard let next = self . findNext ( ) else {
@@ -170,12 +171,11 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
170171 ///
171172 /// - parameter virtualTime: Absolute time to advance the scheduler's clock to.
172173 public func advanceTo( _ virtualTime: VirtualTime ) {
173- MainScheduler . ensureExecutingOnScheduler ( )
174-
175174 if self . running {
176175 fatalError ( " Scheduler is already running " )
177176 }
178177
178+ ensusreRunningOnCorrectThread ( )
179179 self . running = true
180180 repeat {
181181 guard let next = self . findNext ( ) else {
@@ -199,8 +199,7 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
199199
200200 /// Advances the scheduler's clock by the specified relative time.
201201 public func sleep( _ virtualInterval: VirtualTimeInterval ) {
202- MainScheduler . ensureExecutingOnScheduler ( )
203-
202+ ensusreRunningOnCorrectThread ( )
204203 let sleepTo = self . converter. offsetVirtualTime ( self . clock, offset: virtualInterval)
205204 if self . converter. compareVirtualTime ( sleepTo, self . clock) . lessThen {
206205 fatalError ( " Can't sleep to past. " )
@@ -211,8 +210,7 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
211210
212211 /// Stops the virtual time scheduler.
213212 public func stop( ) {
214- MainScheduler . ensureExecutingOnScheduler ( )
215-
213+ ensusreRunningOnCorrectThread ( )
216214 self . running = false
217215 }
218216
@@ -221,6 +219,12 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
221219 _ = Resources . decrementTotal ( )
222220 }
223221 #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+ }
224228}
225229
226230// MARK: description
0 commit comments