Swift2 更新Firebase查询后,从中复制了内容
我正在使用Swift和Firebase做一个关于共享笔记的应用程序 加载显示注释的视图后,tableview将填充每行的注释信息: 为此,首先我执行一个查询以查找用户遵循的注释的ID,然后通过另一个查询从每个ID获得注释信息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
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调用行为。返回视图时无需刷新或添加最后一项,因为它是自动执行的。这就是它被复制的原因。如果你现在去看他们的手册更容易理解,我还是不明白,因为我的应用程序目前有两个实例存在同样的问题,有没有地方直接给你发消息,也许你可以帮我解决?