2016-03-16 47 views
0

我在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) 
    } 
} 
+0

我對這個問題的看法是,當你從一個視圖控制器導航離開它不會需要同步,因爲它不可見。如果它在你沒有看的時候就是同步的,那就是漏了,沒有什麼比泄漏的控制器更糟。爲防止泄漏,請在離開控制器時執行ref.removeObserverWithHandle。這將導致它停止觀察並防止泄漏(和開銷)。如果添加了觀察者,它將開始觀察和重新同步數據。在你的情況下,如果你不清除數組,額外的數據將被添加到現有的數據。 – Jay

+0

是的,但是對於用戶體驗來說這並不壞,當他剛從一個新視圖開始時,現在整個數據被重新加載並且桌面視圖從頂部開始... – telip007

+0

例如,用戶點擊然後轉到細節視圖控制器,然後他返回,所有數據都消失了,他必須再次滾動到原始位置(例如使用大量數據) – telip007

回答

0

如果將第一個偵聽器添加到某個位置,Firebase將下載該位置的當前數據並開始同步這些更改。它會保留內存中可用數據的副本。

如果您向該位置添加第二個偵聽器,而第一個偵聽器仍處於活動狀態,則Firebase不會重新下載數據。我剛剛很快驗證了這個http://jsbin.com/foduxun/edit?js,console

如果您在之前刪除第一個偵聽器,則附加第二個偵聽器,Firebase將清除其緩存。那麼當你再次附加一個監聽器時,它會重新下載數據。

如果你想保持現有的數據,你超脫所有的聽衆,enable disk persistence即使在設備上:

[Firebase defaultConfig].persistenceEnabled = YES; 
+0

我啓用了持久性,我的問題是我在我的tableview中有兩次數據,而且我不想每次用戶切換視圖時清除數組,所以我需要找到解決方案來檢查下載的數據是否包含在我的數組中...... – telip007

+1

但是在firebase文檔中,寫道您應該刪除viewDidDisappear中的偵聽器:並且該firebase不會再次下載相同的數據... – telip007

+0

還是我誤解了某些內容? – telip007

相關問題