Firebase ObserveEvent childAdded等到完成

时间:2016-06-30 09:41:50

标签: swift firebase firebase-realtime-database

我正在使用新的firebase api来观察名为"帖子"

的实时数据库中的子路径

这是一个JSON条目:

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

问题是每当我向"帖子"添加内容时触发了childAdded事件,我的app数据库更新了。遗憾的是,并未使用setValue()添加所有数据。

有没有办法只在所有项目添加时写入数据库?然后,当添加了一个帖子的所有数据时,将childAdded信号发送到应用程序?

非常感谢任何帮助。

基本示例代码如下:

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

2 个答案:

答案 0 :(得分:1)

你可以简单地使用updateChildValues,保留你想要在数组中写的更改

 let childUpdates = ["/posts/\(postKey)": postData,
                    "/posts/\(anotherPostId)": anotherPostData]

如果您要更新所有帖子,请致电

ref.updateChildValues(childUpdates)

这将写入一次数据,它将为您添加的每个孩子调用一个ChildAdded事件。

文档here

答案 1 :(得分:1)

在代码中构建一个对象,说一个字典并一次写出来!这将消除必须进行迭代。然后你可以执行setValue(myObject),问题就会消失。

我发了一些快速代码来生成类似于你正在使用的数据结构。这将在代码中构建结构,然后使用一个setValue将其写出来。

假设您需要以下数据结构

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

以下是如何在代码中获取

    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)