解決策が見つかりました。
// 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
完了ハンドラを使わずに値を返すことは不可能ではありません。私はあなたに簡単な答えを与えました。 –