2016-06-30 3 views
0

getan warte ich die neue Feuerbasis api bin mit einem Kind Pfad in der Echtzeit-Datenbank zu beobachten, als „Beiträge“Firebase ObserveEvent childAdded bis

Hier ist ein JSON Eintrag:

"posts" : { 

"-KLT6oYF-F_5sf-dC_2R" : { 
    "items" : { 
    "item1" : { 
     "location" : "Post Street Mall", 
     "name" : "Glasses", 
     "price" : "199", 
     "vendor" : "Clicks" 
    }},  
    "tags" : "summer, casual, urban ", 
    "title" : "Casual Summer " 
} 

Das Problem ist, wenn Ich füge etwas zu "posts" hinzu, das childAdded-Ereignis wird ausgelöst und meine App-Datenbank wird aktualisiert. Leider wurden noch nicht alle Daten mit setValue() hinzugefügt.

Gibt es eine Möglichkeit, nur in die Datenbank zu schreiben, wenn alle Elemente hinzugefügt wurden? Und wenn alle Daten für einen Post hinzugefügt wurden, senden Sie das childAdded-Signal an die App?

Jede Hilfe wird sehr geschätzt.

Basic-Beispielcode folgt:

// CREATING DATABASE OBSERVER TO SCAN POSTS 

    let postRef = database.child("posts") 
    // CONNECTING OBSERVER AND CHECKING FOR NEW ITEMS 
    postRef.observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in 

    // This is in a different class 
    postDBRef.child("title").setValue(self.mainImageTxt?.text) // I think this triggers the child added already?    postDBRef.child("tags").setValue(self.tagsTxt?.text?.lowercaseString)     
    // getting cell data 
    for rowIndex in 0..<self.stepperValue { 
     let cell = self.tableView.cellForRowAtIndexPath(NSIndexPath(forRow: rowIndex, inSection: 0)) as! AddPostTableViewCell 
     let itemName = cell.itemNameTxt.text! 
     postDBRef.child("items/item\(rowIndex + 1)/name").setValue(itemName) 
      } 
+0

Weicht Sprache spielt Du in Code bekommen? – adolfosrs

+0

war nicht sicher, ob dies so relevant ist, weil es mehr eine Firebase-API-Sache ist. Aber ich benutze Swift 2.0 – arvidurs

+0

eigentlich ist es nicht. Aber es ist nett, damit wir Ihnen ein paar Beispiele in der richtigen Sprache schreiben können :) – adolfosrs

Antwort

1

Erstellen Sie ein Objekt im Code, sagen Sie ein Wörterbuch und schreiben Sie es auf einmal aus! Das macht es überflüssig, diese Iteration durchzuführen. Sie können dann SetValue (myObject) und das Problem verschwindet.

Ich habe einen schnellen Code ausgetüftelt, um die Datenstruktur ähnlich wie bei Ihnen zu erstellen. Dadurch wird die Struktur im Code erstellt und dann mit einem setValue ausgegeben.

Angenommen, Sie die folgende Datenstruktur

items 
    item4 
    name: some item 3 
    item8 
    name: some item 7 

Hier ist, wie zu tun, dass

let stepperValue = 10 
    var myDict = [String: [String: String] ]() 

    for rowIndex in 0..<stepperValue { 
     let itemName = "some item \(rowIndex)" 
     let childDict = ["name": itemName] 
     let parentKey = "item\(rowIndex + 1)" 
     myDict[parentKey] = childDict 
    } 

    let ref = myRootRef.childByAppendingPath("items") 
    ref.setValue(myDict) 
+0

Funktioniert wie ein Charme! Vielen Dank :) – arvidurs

1

Sie einfach mit updateChildValues gehen könnte, um die Änderungen zu halten Sie

in einem Array

let childUpdates = ["/posts/\(postKey)": postData, 
        "/posts/\(anotherPostId)": anotherPostData] 
schreiben möchten Und wenn Sie alle Beiträge haben möchten Sie Update Sie rufen einfach

ref.updateChildValues(childUpdates) 

Dies wird die Daten einmal schreiben und es wird Rufen Sie für jedes von Ihnen hinzugefügte Kind ein ChildAdded-Ereignis auf.

Dokumentation here.

+0

Ich werde es versuchen! Ich hoffe es ist so einfach! Danke :) – arvidurs

Verwandte Themen