Files
sing-box-for-apple/Extension/Extension+RunBlocking.swift
T
2023-07-15 15:03:45 +08:00

24 lines
537 B
Swift

import Foundation
import Libbox
import NetworkExtension
func runBlocking<T>(_ body: @escaping () async throws -> T) throws -> T {
let semaphore = DispatchSemaphore(value: 0)
let box = resultBox<T>()
Task {
do {
let value = try await body()
box.result = .success(value)
} catch {
box.result = .failure(error)
}
semaphore.signal()
}
semaphore.wait()
return try box.result.get()
}
private class resultBox<T> {
var result: Result<T, Error>!
}