我在swift中使用firebase,我在viewDidAppear中調用監聽器:因爲它是在文檔中編寫的,它不應該再次下載相同的數據,但現在每次顯示視圖時都會顯示相同的數據。Firebase下載相同的數據
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)
}
}
我對這個問題的看法是,當你從一個視圖控制器導航離開它不會需要同步,因爲它不可見。如果它在你沒有看的時候就是同步的,那就是漏了,沒有什麼比泄漏的控制器更糟。爲防止泄漏,請在離開控制器時執行ref.removeObserverWithHandle。這將導致它停止觀察並防止泄漏(和開銷)。如果添加了觀察者,它將開始觀察和重新同步數據。在你的情況下,如果你不清除數組,額外的數據將被添加到現有的數據。 – Jay
是的,但是對於用戶體驗來說這並不壞,當他剛從一個新視圖開始時,現在整個數據被重新加載並且桌面視圖從頂部開始... – telip007
例如,用戶點擊然後轉到細節視圖控制器,然後他返回,所有數據都消失了,他必須再次滾動到原始位置(例如使用大量數據) – telip007