2017-10-28 12 views
0

私はfirebaseを初めて使用しています。オブザーバブロックでデータを返すことができるかどうかを知りたいのですが。私はクラスApiManager:NSObjectを持っています。このクラスでは、データベースから何らかのデータを返すfirebase関数をすべて作成したいと考えています。これは、このクラスFirebase observer code block swiftの関数からデータを返す

func downloadDailyQuote() -> [String:String] { 

    let reference = Database.database().reference().child("daily") 

    reference.observeSingleEvent(of: .value) { (snap) in 
     return snap.value as! [String:String] //I want to return this 
    } 


    return ["":""] //I don't want to return this 
} 

の私の機能の一つであり、私は今、let value = ApiManager().downloadDailyQuote()ような何かをすれば、valueは空の辞書が含まれています。それに対する解決策はありますか?

答えて

1

更新: .observeSingleEventを呼び出すと、メソッドが非同期に呼び出されます。これは、メソッドが動作するようになることを意味しますが、応答は後で来てメインスレッドをブロックしません。このメソッドを呼び出すと、まだデータがないため、空の辞書を返します。

完了ブロックを使用すると、メソッドアクションが完了するとすぐにデータが取得されます。

func downloadDailyQuote(completion: @escaping ([String:String]) -> Void) { 
    let reference = Database.database().reference().child("daily") 

    reference.observeSingleEvent(of: .value) { (snap) in 

     if let dictionaryWithData = snap.value as? [String:String] { 
     completion(dictionaryWithData) 
     } else { 
     completion(["" : ""]) 
     }   
    } 
} 
+0

あなたのコードを少し説明できますか? –

+0

ありがとう:) –

関連する問題