私は、Firebaseへの非同期読み込み呼び出しを行って配列に値を設定する関数を持っています。呼び出しが終了しないで関数が戻ります。非同期呼び出しが終了して配列を返すのを待つ方法はありますか? 私はこの問題を解決する方法を見つけることができませんが、私はdispatchQueueとセマフォを使用してみました。Swift 3でFirebase非同期読み取りコールを待つ方法は?
class func generateModelArray() -> [Model]{
var dbref: DatabaseReference?
dbref = Database.database().reference()
var modelAry = [Model]()
let semaphore = DispatchSemaphore(value: 1)
dbref?.child("Parts").observe(.childAdded, with: { (snapshot) in
semaphore.wait()
let partName = snapshot.key
let dict = snapshot.value! as? [String:AnyObject]
let partYear = dict!["year"] as! String
let partPrice = dict!["price"] as! String
//print(partName, partYear, partPrice)
let mod = Model(name: partName, year: partYear, price: partPrice)
modelAry.append(mod)
print(modelAry)
semaphore.signal()
})
semaphore.wait()
return modelAry
}
のlinux内のセマフォの私の理解から、私はセマフォをロックしたときに、それは他のスレッドをブロックし、I信号と、それは、セマフォのロックを解除して続行するために、他のスレッドが可能になります。 observe()呼び出しでセマフォをロックするにはどうすればいいですか?コールが開始する前に関数が返ってくるので?