2016-07-16 1 views
7

火災基地のデータを取得することについて質問したいだけです。 firebaseがデータを取り出すのをどのように処理できますか?完了ハンドラは表示されません。 この火災基地データの検索が終了した後、いくつかの関数を呼び出す必要があります。どうすればいいですか?Firebaseがデータの取得を完了したとき、私のコードはどのように知ることができますか?

DataService.ds.POST_REF.queryOrderedByChild("created_at").observeEventType(.ChildAdded, withBlock: { snapshot in 
     if let postDict = snapshot.value as? Dictionary<String, AnyObject> { 
      let postKey = snapshot.key 
      let post = Post(postKey: postKey, dictionary: postDict) 
      self.posts.append(post) 
     } 
    }) 

答えて

4

Firebaseでは、実際には「完了」という概念はありません(「子が追加されました」)。それは単なるデータストリームです(誰かが新しいデータを追加してから最初のデータが「完成」するまで)。 'value'イベントを使ってオブジェクト全体を取得することはできますが、 'child added'のように新しいレコードが追加されるわけではありません。

実際にが完了したときに子を追加して通知を受ける必要がある場合は、が完了したら、タイマーを設定できます。私はすぐにはわかりませんが、ここには論理があります。

  1. 「子追加」イベントを設定します。
  2. いくつかのfinishedLoading()関数を500msecで呼び出すようにタイマーを設定します。
  3. 「子追加」イベントがトリガーされるたびに、手順2で設定したタイマーを破棄し、もう1つ作成します(つまり、もう500ms延長します)。

新しいデータの入力が停止すると、タイマーは延長されなくなり、finsihedLoading()は500ms後に呼び出されます。

500msはちょうど作られた番号ですが、どんなものでも使用してください。

0

SingleEventOfType(.Value)を1回要求します。これにより、最初にすべての情報がワンショットで表示され、一度データを取得すると完了したい機能を実行できます。

あなたはchildAdded用に別のクエリを作成し、次に新しい投稿が

2

はそうのような完了ハンドラを持つ関数内のコードのあなたの全体のブロックを書く追加されたとき、やりたいことが何もすることができます。

func aMethod(completion: (Bool) ->()){ 
DataService.ds.POST_REF.queryOrderedByChild("created_at").observeEventType(.ChildAdded, withBlock: { snapshot in 
     if let postDict = snapshot.value as? Dictionary<String, AnyObject> { 
      let postKey = snapshot.key 
      let post = Post(postKey: postKey, dictionary: postDict) 
      self.posts.append(post) 
     } 
     completion(true) 
    }) 
} 

次にどこかそうのようにそれを呼び出す:

aMethod { success in 
guard success == true else { 
//Do something if some error occured while retreiving data from firebase 
return 
} 
//Do something if everything went well. 
. 
. 
. 
+0

それは.childAddedのスナップショットのために動作しません... –

関連する問題