2017-06-07 3 views
0

Ich bin Firebase ganz neu und benutze es zusammen mit Swift. Ich versuche zu verstehen, wie man die Firebase-Datenbank benutzt.Erstellen Sie zusammen mit Firebase einen DataManger

Normalerweise, wenn ich mit Daten in Swift arbeite, erstelle ich einen DataManager, der alle Arbeiten mit Daten/Datenbank/API bearbeitet, so dass der Code isoliert und nicht überladen wird.

In einem Tableviewcontroller die Daten laden ich später nur so etwas wie

self.items = DataManager.shared.getItems() 

tun können, wenn im Anschluss an die verschiedenen Tutorials Firebase ich gefunden habe, dass in allen Beispielen alle Datenverarbeitung in dem Viewcontrollers selbst vorgenommen werden. For example this tutorial In einem Tableviewcontroller sie so etwas wie haben würde: es auf diese Weise

let ref = FIRDatabase.database().reference(withPath: "items") 

override func viewDidLoad() { 
    ref.observe(.value, with: { snapshot in 
     var newItems: [Item] = [] 

     for item in snapshot.children { 
      let newItem = Item(snapshot: item as! FIRDataSnapshot) 
      newItems.append(newItem) 
     } 
     self.items = newItems 
     self.tableView.reloadData() 
    }) 
} 

Wahrscheinlich, weil sie tun, das ist nur ein Beispiel und es ist einfacher zu erklären. Aber ich denke, auf diese Weise wird die App überladen und ich verschiebe das Zeug lieber in einen DataManager.

Ich habe versucht, ein Verständnis dafür zu bekommen, wie man es auf eine gute Weise macht, aber ich kann es nicht herausfinden. Wie stellt man sicher, dass die Beobachter usw. entfernt werden? Wie würdest du es machen? Gibt es ein gutes Beispiel für die Erstellung dieser Struktur? Oder funktioniert Firebase nicht so?

Antwort

0

Sie sollten completion handlers zu Ihren Funktionen im Datenmanager hinzufügen.

So:

override func viewDidLoad() { 
    super.viewDidLoad() 

    DataManager.getItems() { items in 
     // this part will be called, when data is loaded in DataManager 
     self.items = items 
     self.tableView.reloadData() 
    }) 
} 

DataManager func:

static func getItems(completion: @escaping (_items: [Item]) -> Void) { 
    ref.observe(.value, with: { snapshot in 
     var newItems: [Item] = [] 

     for item in snapshot.children { 
      let newItem = Item(snapshot: item as! FIRDataSnapshot) 
      newItems.append(newItem) 
     } 

     completions(newItems) 
    }) 
} 

Hoffe, es hilft

+0

Great! Vielen Dank! Aber wann kann ich ref.removeObserverWithHandle (handle) aufrufen, um sicherzustellen, dass der Listener entfernt wird? Ist der Ref auch im DataManager und wird er von mehreren Viewcontrollern verwendet? – Martin

+0

@Martin Ich habe das noch nie gemacht. Aber ich bin mir ziemlich sicher, dass Sie Beobachter im Datenmanager entfernen können. Und alles sollte gut sein. :) auch wenn es geholfen hat, es als Antwort pls zu markieren –

+0

danke! Aber wann sollte ich das Ref initieren und wann sollte ich es entfernen? Da die Referenz nun im DataManager enthalten ist, könnte sie gleichzeitig von mehreren Orten in der App verwendet werden. – Martin

Verwandte Themen