SwiftUI AsyncButton ?️

AsyncButton is a Button capable of running concurrent code.


AsyncButton has the exact same API as Button, so you just have to change this:

Button("Run") { run() }

to this:

AsyncButton("Run") { try await run() }

In addition to Button initializers, you have the possibilities to specify special behaviours via AsyncButtonOptions:

AsyncButton("Ciao", options: [.showProgressViewOnLoading, .showAlertOnError], transaction: Transaction(animation: .default)) {
    try await run()

For heavy customizations you can have access to the AsyncButtonOperations:

AsyncButton {
    try await run()
} label: { operations in
    if operations.contains { operation in
        if case .loading = operation {
            return true
        } else {
            return false
    } {
    } else if
        let last = operations.last,
        case .completed(_, let result) = last
        switch result {
        case .failure:
            Text("Try again")
        case .success:
            Text("Run again")
    } else {


  1. In Xcode, open your project and navigate to FileSwift PackagesAdd Package Dependency…
  2. Paste the repository URL (https://github.com/lorenzofiamingo/swiftui-async-button) and click Next.
  3. Click Finish.

Other projects

SwiftUI CachedAsyncImage ?️

SwiftUI MapItemPicker ?️

SwiftUI PhotosPicker ?

SwiftUI VerticalTabView ?

SwiftUI SharedObject ?


View Github