Contents

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 +0000

The 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 later

It 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

  1. Open menu File > Add Packages...
  2. Search for "https://github.com/berikv/VirtualTimeScheduler.git" and click Add Package.
  3. Open your project file, select your target in "Targets".
  4. Open Dependencies
  5. Click the + sign
  6. 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