我找到了解决方案。
// REFERENCED TO: https://gist.github.com/kylesluder/478bf8fd8232bc90eabd
struct Await<T> {
fileprivate let group: DispatchGroup
fileprivate let getResult:() -> T
@discardableResult func await() -> T { return getResult() }
}
func async<T>(_ queue: DispatchQueue = DispatchQueue.global() , _ block: @escaping() -> T) -> Await<T> {
let group = DispatchGroup()
var result: T?
group.enter()
queue.async(group: group) { result = block(); group.leave() }
group.wait()
return Await(group: group, getResult: { return result! })
}
打电话来这样。
let data = async{ return try? Data(contentsOf: someUrl) }.await()
OR
更简单:
@discardableResult func async<T>(_ block: @escaping() -> T) -> T {
let queue = DispatchQueue.global()
let group = DispatchGroup()
var result: T?
group.enter()
queue.async(group: group) { result = block(); group.leave(); }
group.wait()
return result!
}
呼叫喜欢这个。
let data = async{ return try? Data(contentsOf: someUrl) }
(并感谢编辑我的问题,希曼。)
感谢您的回答。 但我希望代码很容易调用。 – LONELiE
不使用完成处理程序返回值并不是不可能的,我给你简单的答案。 –