我在 swift 中使用 firebase,我在 viewDidAppear: 中调用监听器:正如文档中所写,它不应该再次下载相同的数据,但现在每次 View 出现时都会显示相同的数据。
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(true)
getData()
self.messagesRef.keepSynced(true)
}
func getData(){
messagesRef.observeEventType(.ChildAdded) { (mesData: FDataSnapshot!) -> Void in
let messageDict = mesData.value as! NSDictionary
let key = mesData.key
self.likedRef = self.ref.childByAppendingPath("likedMessages/\(currentUser.uid)/\(key)")
self.likedRef.observeSingleEventOfType(.Value) { (likedFd: FDataSnapshot!) -> Void in
if likedFd.value is NSNull{
let liked = false
let message = Message(message: messageDict, key: key, liked: liked, topicKey: self.topic.key)
self.messages.append(message)
self.messages.sortInPlace{$0.createdAt.compare($1.createdAt) == .OrderedDescending}
}
else{
let liked = likedFd.value as! Bool
let message = Message(message: messageDict, key: key, liked: liked, topicKey: self.topic.key)
self.messages.append(message)
self.messages.sortInPlace{$0.createdAt.compare($1.createdAt) == .OrderedDescending}
}
dispatch_async(dispatch_get_main_queue()) { () -> Void in
self.messagesTableView.reloadData()
}
self.likedRef.keepSynced(true)
}
print(mesData.value)
}
}
最佳答案
如果您将第一个监听器添加到某个位置,Firebase 将下载该位置的当前数据并开始同步更改。它将在内存中保留可用数据的副本。
如果您向该位置添加第二个监听器,而第一个监听器仍处于事件状态,Firebase 将不会重新下载数据。我刚刚快速验证了这一点http://jsbin.com/foduxun/edit?js,console .
如果您在附加第二个监听器之前删除第一个监听器,Firebase 将清除其缓存。因此,当您再次附加监听器时,它将重新下载数据。
如果您希望在分离所有监听器后仍保留设备上的数据可用,enable disk persistence :
[Firebase defaultConfig].persistenceEnabled = YES;
关于ios - Firebase 下载相同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36039742/