Swift2 更新Firebase查询后,从中复制了内容

Swift2 更新Firebase查询后,从中复制了内容,swift2,firebase,Swift2,Firebase,我正在使用Swift和Firebase做一个关于共享笔记的应用程序 加载显示注释的视图后,tableview将填充每行的注释信息: 为此,首先我执行一个查询以查找用户遵循的注释的ID,然后通过另一个查询从每个ID获得注释信息 override func viewDidLoad() { super.viewDidLoad() listOfNotes.removeAll() //QUERY NOTES IDs IN USER let userRef = ref

我正在使用Swift和Firebase做一个关于共享笔记的应用程序

加载显示注释的视图后,tableview将填充每行的注释信息:

为此,首先我执行一个查询以查找用户遵循的注释的ID,然后通过另一个查询从每个ID获得注释信息

override func viewDidLoad() {
    super.viewDidLoad()

    listOfNotes.removeAll()

    //QUERY NOTES IDs IN USER

    let userRef = ref.childByAppendingPath("users/" + sessionUserID + "/participating")

    userRef.queryOrderedByValue().observeEventType(.ChildAdded, withBlock: { snapshot in

        //Saving note ID
        let savingNoteID = snapshot.key

        let notesDetailsRef = ref.childByAppendingPath("notes/" + savingNoteID + "/details")

        self.dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"

        notesDetailsRef.observeEventType(.Value, withBlock: { snapshot2 in

            let fireNoteTitle = snapshot2.value.objectForKey("noteTitle")! as! String
            let fireNoteText = snapshot2.value.objectForKey("noteText")! as! String
            let fireNoteUpdatedToConvert = snapshot2.value.objectForKey("noteUpdate")! as! String
            let fireNoteUpdatedConverted = self.dateFormatter.dateFromString(fireNoteUpdatedToConvert)

            let newNote = NoteInfo(noteID: savingNoteID as String, noteTitle: fireNoteTitle , noteUsers: "Users" as String, noteText: fireNoteText as String, noteUpdated: fireNoteUpdatedConverted!)

            listOfNotes.append(newNote)
            self.tableNotes.reloadData()

        })
    })
}
然后,选择一行,转到一个新的VC,以查看注释中的信息

稍后,当我离开note视图返回列表时,在
视图中将消失
,我更新noteinfo:

ref.updateChildValues([
        "notes/" + sessionNoteID + "/details/noteText": texto,
        "notes/" + sessionNoteID + "/details/noteTitle": title,
        "notes/" + sessionNoteID + "/details/noteCreator" : fireNoteCreator,
        "notes/" + sessionNoteID + "/details/noteCreation" : fireNoteCreation,
        "notes/" + sessionNoteID + "/details/noteUpdate" : String(NSDate())])
并且以前选择的注释显示为重复: (你知道为什么会发生这种情况吗?如果我删除了更新,或者如果我只是加载NoteID而不是详细信息,那么它会工作得很好。)

谢谢


这似乎没有重复,似乎阵列中添加了另一个注释;时间戳是不同的

将观察者添加到节点(.Value)时,初始数据会触发观察者一次,每次数据更改时会再次触发观察者


在这种情况下,如果您更新数据,将调用块,并添加带有新时间戳的“新”注释。

如果该注释看起来没有重复,则表明已将另一个注释添加到数组中;时间戳是不同的

将观察者添加到节点(.Value)时,初始数据会触发观察者一次,每次数据更改时会再次触发观察者



在这种情况下,如果您更新数据,将调用块并添加带有新时间戳的“新”注释。

我遇到了同样的问题。你知道怎么处理吗?如果我必须听数据变化?@vzhen所以问题是你在重复努力。1) 将对象附加到数组中,当数据写入Firebase节点时,Firebase节点也会读入数据并将其附加到数组中,因此最终会产生重复的数据。因此,最好的选择是这样或那样:要么在写数据时停止观察节点,要么写数据并让数组从这些写操作中填充。感谢您的回复,您所说的
让数组从这些写操作中填充是什么意思?你的意思是我必须在渲染到视图之前使用.slice()或concat()填充数组吗?不。请记住,当你写入正在观察的节点时,数据会发送到你的应用程序。因此,如果您在应用程序的某个部分向某个节点写入数据,并且该节点正在被观察,那么您刚才写入的数据将被发送到应用程序。在这种情况下,您可以使用该数据来填充数组,而不是写入函数中的array.append(data)。如果在观察者块内执行追加操作以及向数组添加数据,则数据将被复制。我找到了这篇文章。这就是你的意思吗?我也有同样的问题。你知道怎么处理吗?如果我必须听数据变化?@vzhen所以问题是你在重复努力。1) 将对象附加到数组中,当数据写入Firebase节点时,Firebase节点也会读入数据并将其附加到数组中,因此最终会产生重复的数据。因此,最好的选择是这样或那样:要么在写数据时停止观察节点,要么写数据并让数组从这些写操作中填充。感谢您的回复,您所说的
让数组从这些写操作中填充是什么意思?你的意思是我必须在渲染到视图之前使用.slice()或concat()填充数组吗?不。请记住,当你写入正在观察的节点时,数据会发送到你的应用程序。因此,如果您在应用程序的某个部分向某个节点写入数据,并且该节点正在被观察,那么您刚才写入的数据将被发送到应用程序。在这种情况下,您可以使用该数据来填充数组,而不是写入函数中的array.append(data)。如果在观察者块内执行追加操作以及向数组添加数据,则数据将被复制。我找到了这篇文章。这就是你的意思吗?嗨,维克多,我能知道你是怎么克服的吗?是的,我知道。是因为(.Value)是如何工作的。您到底是如何解决这个问题的,请给出一个代码段please@SimpiMind我不太了解Firebase API调用行为。返回视图时无需刷新或添加最后一项,因为它是自动执行的。这就是它被复制的原因。如果你现在去看他们的手册更容易理解,我还是不明白,因为我的应用程序目前有两个实例存在相同的问题,有没有地方可以直接给你发消息,也许你可以帮我?嗨,维克托,我可以知道你是如何克服这个问题的吗?是的,我知道了。是因为(.Value)是如何工作的。您到底是如何解决这个问题的,请给出一个代码段please@SimpiMind我不太了解Firebase API调用行为。返回视图时无需刷新或添加最后一项,因为它是自动执行的。这就是它被复制的原因。如果你现在去看他们的手册更容易理解,我还是不明白,因为我的应用程序目前有两个实例存在同样的问题,有没有地方直接给你发消息,也许你可以帮我解决?