2015-02-11 45 views
1

我正嘗試從UbaseView中加載來自Firebase的數據。我加載的結構是:通過observeSingleEventOfType將Firebase日期加載到UITableView中並附加ChildAdded Observer

user: { 
    "simplelogin:12": 1, 
    "simplelogin:13": 1, 
    "simplelogin:15": 1, 
    "simplelogin:17": 1 
} 

我想第一時間來加載這些數據,當視圖被加載(或當它出現了,如果我要求做的是),我想「偵聽」並只將所有新的子數據添加到UITableView。 但是,我的數據加載了兩次。我怎樣才能做到這一點?

目前,我的視圖控制器的主要部分是:

override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     self.tableView.delegate = self 
     self.tableView.dataSource = self 

     // Load user 
     loadFirebaseUser() 
    } 

func loadFavoriteUser() { 
     let firebaseRef = Firebase("http://...") 

     // Add Observer on Child Added 
     firebaseRef.observeEventType(.ChildAdded, withBlock: { userSnapshot in 
       println("added \(userSnapshot.key)") 
     }) 

     // Initialization 
     firebaseRef.observeSingleEventOfType(.Value, withBlock: { userSnapshot in 
      println("value \(userSnapshot.value)") 

      self.tableView.reloadData() 
     }) 
    } 

輸出是

added simplelogin:12 
added simplelogin:13 
added simplelogin:15 
added simplelogin:17 
value { 
    "simplelogin:12" = 1; 
    "simplelogin:13" = 1; 
    "simplelogin:15" = 1; 
    "simplelogin:17" = 1; 
} 

的幫助

+1

我不明白你的問題非常感謝,但可以確認您顯示的輸出是預期的。 Firebase首先爲每個孩子啓動一個ChildAdded事件,然後爲所有孩子合併一個Value事件。但你爲什麼要爲這兩個事件註冊處理程序?只是ChildAdded **或**值應該足夠用於大多數使用情況。 – 2015-02-11 20:13:57

回答

0
func loadFavoriteUser() { 
    let firebaseRef = Firebase("http://...") 

    // Add Observer on Child Added 
    firebaseRef.observeEventType(.ChildAdded, withBlock: { userSnapshot in 
      println("added \(userSnapshot.key)") 
      self.tableView.reloadData() 
    }) 

} 
+0

我發現這種方法不好,如果你有大量的初始數據。您需要首先獲取所有數據,添加內部數據,然後重新加載tableview,然後聆聽更多數據。由於某些原因,雖然在我的嘗試中,我得到重複的數據,因爲'.childAdded'不正確地獲取它已經從observeSingleEvent/.value獲得的數據。 – Jonny 2017-05-22 02:08:37