The proposed approach hangs on iOS, though not on macOS, which is fascinating in its own right. See inline comments:

```swift
import SwiftUI

@main
struct BlockerApp: App {
    var body: some Scene {
        WindowGroup {
            BlockerView()
        }
    }
}

struct BlockerView: View {
	
	@State var count = 0
	
	var body: some View {
		VStack {
			
			Text("\(count)")
			
			Button("Increment") { // tapping on the button hangs the app
				count += blocking {
					1
				}
			}
		}
	}
}

func blocking<A>(_ ƒ: @escaping () async -> A) -> A {
	let semafore = DispatchSemaphore(value: 0)
	let got = Got<A>()
	Task.detached(priority: .high) {
		got.a = await ƒ() // gets as far as this line but ƒ never returns
		semafore.signal()
	}
	semafore.wait()
	return got.a!
}

private class Got<A> {
	var a: A?
}
```