2016-07-16 67 views
7

我只想問關於firebase檢索數據。我如何處理firebase檢索數據完成?我沒有看到任何完成處理程序。 我想在此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'事件來獲取整個對象,但不會爲您添加新記錄,因爲它們會添加爲'添加的子項'。

如果您確實需要使用添加的孩子並在時收到通知,那麼可能已完成,您可以設置一個計時器。我不知道很快,但這是邏輯。

  1. 設置您的'添加子項'事件。
  2. 設置一個定時器在500ms內調用一些finishedLoading()函數。
  3. 每次觸發'添加子項'事件時,都會銷燬第二步中設置的定時器並創建另一個定時器(即延長500ms)。

當新的數據停止進來時,定時器將停止擴展,finsihedLoading()將在500ms後調用。

500ms只是一個編號,使用任何適合。

0

對SingleEventOfType(.Value)做一個請求。這將最初以一次性的方式爲您提供所有信息,讓您一旦擁有該數據即可完成您想要完成的任何功能。

您可以創建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快照工作... –

相關問題