2017-10-30 19 views
1

私は、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()呼び出しでセマフォをロックするにはどうすればいいですか?コールが開始する前に関数が返ってくるので?

答えて

0

非同期呼び出しでは、非同期呼び出しの実行が完了する前にコードの完了を計画する必要があります。完了ハンドラクロージャを関数に渡し、Firebaseの結果を呼び出します。このような何か:Firebaseが戻ってきたときに

class func generateModelArray(complete: @escaping (_ result: Bool, _ error: Error?)->Void) -> [Model]{ 

次に、あなただけのあなたの完全な機能を呼び出すことができます。

var someResult = true 
var someError = nil 
complete(someResult, someError) 

は、完全な機能は、あなたが返すようにしたいものに応じて、引数として受け入れるものを調整します。

関連する問題