2016-08-02 13 views
2

Ich habe eine einfache iOS-App, die 1.000 Kontakte mit meiner Firebase synchronisiert. persistenceEnabled ist in meinem AppDelegate auf True festgelegt.Firebase ChildAdded Brennen jedes Mal in meiner iOS App

In meinem UITableViewController beobachte ich das ChildAdded-Ereignis, laden Sie die Kontakte und das funktioniert gut.

Das Problem ist das - das nächste Mal, wenn ich die App öffne, zurück zum UITableViewController, das ChildAdded-Ereignis erneut ausgelöst und lädt die 1.000 Kontakte.

Ich dachte, dass bei nachfolgenden Starts das ChildAdded-Ereignis nicht ausgelöst werden würde, da persistenceEnabled true ist und keine neuen Children hinzugefügt wurden.

Habe ich missverstanden, wie Firebase funktioniert?

ref.child("contacts").observeEventType(.ChildAdded, withBlock: { snapshot in 

    if let json = snapshot.value as? NSDictionary { 

     for key in json.keyEnumerator() { 
      if let dict = json.valueForKey(key as! String) as? NSDictionary { 
       let contact = Contact(data: dict) 
       contacts.append(contact) 
      } 
     } 
    } 
}) 
+0

Überprüfen Sie, ob dieser Code entweder von viewWillAppear oder von viewDidAppear aufgerufen wird. Wenn ja, dann wird es jedes Mal beobachten, wenn Sie zu diesem Controller zurück navigieren. –

+0

Hallo Deepak, es wird in ViewWillAppear aufgerufen, aber das ist nicht das Problem. Ich erwarte, dass es jedes Mal beobachtet wird, wenn ich zum Controller zurück navigiere, aber ich erwarte nicht, dass es jedes Mal 1000 Kontakte zurückgibt. Ich hätte gedacht, es würde nur die 1.000 Kontakte das erste Mal zurückgeben. –

Antwort

0

Da Sie registrieren beobachten Sie observeEventType nicht beobachtenSingleEventType. Registrieren Sie das Ereignis also nur einmal in viewDidLoad. Zum ersten Mal erhalten Sie alle verfügbaren Daten in diesem Knoten. Beim nächsten Mal wird es dir nur das neue Kind geben. Falls Sie Firebase jedes Mal abfragen möchten, registrieren Sie observeSingleEventType, aber es werden wieder alle Daten in diesem Knoten zurückgegeben und der Beobachter wird entfernt, da es sich um objectSingleEventType handelt.

1

Vom Firebase documentation on .ChildAdded:

Das FIRDataEventTypeChildAdded Ereignis einmal ausgelöst wird für jedes bestehendes Kind und dann wieder jedes Mal, wenn ein neues Kind auf den angegebenen Pfad hinzugefügt wird.

Die Verwendung der Persistenz spielt für dieses Verhalten keine Rolle. Es stellt lediglich sicher, dass das Ereignis auch auf diese Weise funktioniert, wenn die App gestartet wird, während Sie keine Netzwerkverbindung haben.

+0

Danke Frank, ich vermutete das war der Fall. Werden 1000 Kontakte in den Speicher geladen? In meinem Szenario möchte ich meinen lokalen Cache von Kontakten haben, den ich dann abfragen kann, wie Sie es in einem typischen CoreData-Szenario tun würden, und diesen Cache nur aktualisieren, wenn ein neuer Kontakt am Backend hinzugefügt wird. Es scheint bei Firebase, dass ich diese 1000 Kontakte immer entweder aus einem lokalen Cache (persistent) oder über das Netzwerk lade. –

+0

Die Firebase-API ist eine Online-erste API, die weiterhin funktioniert, wenn Ihre App für einen kurzen bis mittleren Zeitraum offline ist. Informationen zum Aktualisieren dieser Daten finden Sie unter https://firebase.google.com/docs/database/ios/offline-capabilities#section-prioritizing-the-local-cache –

+0

@FrankvanPuffelen, um diese Situation zu vermeiden. wie ich ausführen möchte .childadded, wenn neues Kind nicht für vorhandene Knoten hinzugefügt wird. –