2016-07-16 126 views
7

Voglio solo chiedere a Firebase di recuperare i dati. Come posso gestire i dati recuperati da Firebase? Non vedo alcun gestore di completamento. Voglio chiamare qualche funzione dopo che il recupero di questi dati firebase è terminato. Come posso gestire ???Come può sapere il mio codice quando Firebase ha terminato il recupero dei dati?

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) 
     } 
    }) 

risposta

4

In Firebase, non esiste un concetto di "finito" (quando si ascolta "aggiunto bambino"). È solo un flusso di dati (immagina qualcuno aggiunge un nuovo record prima che i dati iniziali siano "completati"). Puoi usare l'evento 'value' per ottenere un intero oggetto, ma questo non ti darà nuovi record man mano che vengono aggiunti come fa 'child added'.

Se, è davvero necessario utilizzare child aggiunto e ricevere una notifica quando è probabilmente terminato, è possibile impostare un timer. Non so veloce, ma ecco la logica.

  1. Imposta l'evento "secondario".
  2. Impostare un timer per chiamare una funzione finishedLoading() in 500ms.
  3. Ogni volta che viene attivato l'evento "figlio aggiunto", distruggere il timer impostato nel passaggio 2 e crearne un altro (ovvero estenderlo di altri 500 ms).

Quando i nuovi dati smettono di entrare, il timer smetterà di essere esteso e FinsihedLoading() sarà chiamato 500ms più tardi.

500 ms è solo un numero composto, utilizzare qualsiasi vestito.

0

Eseguire una richiesta per SingleEventOfType (.Value). Questo ti darà tutte le informazioni inizialmente in un colpo, permettendoti quindi di fare qualsiasi funzione tu voglia completare una volta che hai quei dati.

È possibile creare una query separata per childAdded e poi fare tutto ciò ci si vuole fare quando un nuovo post è stato aggiunto

2

Scrivi la intero blocco di codice in una funzione che dispone di un gestore di completamento in questo modo:

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) 
    }) 
} 

quindi chiamare da qualche parte in questo modo:

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

non funziona per gli snapshot .childAdded ... –