swift-timeout is a lightweight wrapper around Task
that executes a closure with a given timeout.
Timeout can be installed by using Swift Package Manager.
Note: Timeout requires Swift 5.10 on Xcode 15.4+. It runs on iOS 13+, tvOS 13+, macOS 10.15+, Linux and Windows.
To install using Swift Package Manager, add this to the dependencies:
section in your Package.swift file:
.package(url: "https://github.com/swhitty/swift-timeout.git", .upToNextMajor(from: "0.3.0"))
Provide a closure and a Instant
for when the child task must complete else TimeoutError
is thrown:
import Timeout
let val = try await withThrowingTimeout(after: .now + .seconds(2)) {
try await perform()
}
TimeInterval
can also be provided:
let val = try await withThrowingTimeout(seconds: 2.0) {
try await perform()
}
Note: When the timeout expires the task executing the closure is cancelled and
TimeoutError
is thrown.
An overload includes a TimeoutController
object allowing the body to cancel or move the expiration where required:
try await withThrowingTimeout(seconds: 1.0) { timeout in
try await foo()
timeout.cancelExpiration()
try await bar()
timeout.expire(afer: 0.5)
try await baz()
}
AsyncTimeoutSequence
allows each iteration a fresh timeout to return the next element;
for try await val in sequence.timeout(seconds: 2.0) {
...
}
swift-timeout is primarily the work of Simon Whitty.