berikv/VirtualTimeScheduler
A Combine Scheduler that executes actions based on a virtual clock.
Usage
step() finds the next action due and updates the time to that actions due time and runs all actions due by that new time.
The run method increases the virtual time step-wise until all scheduled actions have completed.
"3 seconds later" refers to the "virtual time".
let scheduler = VirtualTimeScheduler()
let cancellable = Just(42)
.delay(for: .seconds(3), scheduler: scheduler)
.measureInterval(using: scheduler)
.sink { value in
print("Received \(value.magnitude) seconds later")
}
print("Before run \(Date())")
scheduler.run()
print("After run \(Date())")
// Before run 2022-01-20 14:13:11 +0000
// Received 3.0 seconds later
// After run 2022-01-20 14:13:11 +0000The advanceTime(by:) method advances the virtual time and runs any scheduled actions that are due by the new time.
let scheduler = VirtualTimeScheduler()
let subject = PassthroughSubject<Int, Never>()
let cancellable = subject
.debounce(for: .seconds(1), scheduler: scheduler)
.sink { value in
let timeInterval = scheduler.now.timeIntervalSinceReferenceTime
print("Received \(value), \(timeInterval) seconds later")
}
for value in 0..<4 {
subject.send(value)
scheduler.advanceTime(by: .seconds(0.1))
}
scheduler.advanceTime(by: .seconds(1))
for value in 4..<8 {
subject.send(value)
scheduler.advanceTime(by: .seconds(0.1))
}
scheduler.advanceTime(by: .seconds(1))
_ = cancellable
// Prints:
// Received 3, 1.4 seconds later
// Received 7, 2.8 seconds laterIt is also possible to set the time directly using setTime(to:).
Install
Package.swift
Edit the Package.swift file. Add the VirtualTimeScheduler as a dependency:
let package = Package(
name: " ... ",
products: [ ... ],
dependencies: [
.package(url: "https://github.com/berikv/VirtualTimeScheduler.git", from: "1.0.0") // here
],
targets: [
.target(
name: " ... ",
dependencies: [
"VirtualTimeScheduler" // and here
]),
]
)For .xcodeproj projects
- Open menu File > Add Packages...
- Search for "https://github.com/berikv/VirtualTimeScheduler.git" and click Add Package.
- Open your project file, select your target in "Targets".
- Open Dependencies
- Click the + sign
- Add VirtualTimeScheduler
Package Metadata
Repository: berikv/VirtualTimeScheduler
Stars: 0
Forks: 0
Open issues: 0
Default branch: main
Primary language: swift
License: MIT
README: README.md