2017-10-13 12 views
1

我是iOS開發的新手,我正在學習有關將數據讀取和寫入Firebase的教程。我想從Firebase檢索數據並使用它填充tableView。與使用值事件類型觀察Firebase數據庫相混淆

當觀察參考時,使用.value數據事件類型從實時數據庫檢索數據時感到困惑。這裏是簡化的代碼

class Story 
{ 
    var text = "" 
    var numberOfLikes = 0 
    var numberOfAngry = 0 
    let ref: FIRDatabaseReference! 

    init(snapshot: FIRDataSnapshot) 
    { 
     ref = snapshot.ref 
     if let value = snapshot.value as? [String : Any] { 
      text = value["text"] as! String 
      numberOfLikes = value["numberOfLikes"] as! Int 
      numberOfAngry = value["numberOfAngry"] as! Int 
     } else { 
      numberOfAngry = 0 
      numberOfLikes = 0 
     } 
    } 


} 


class StoriesTableViewController: UITableViewController 
{ 
    // MARK: - Properties 
    var stories = [Story]() 
    private let storiesRef = FIRDatabase.database().reference().child("stories") 

    @IBOutlet weak var composeBarButtonItem: UIBarButtonItem! 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 



     storiesRef.observe(.value, with: { snapshot in 
      self.stories.removeAll() 

      for child in snapshot.children { 
       let story = Story(snapshot: child as! FIRDataSnapshot) 
       self.stories.append(story) 
      } 

      self.tableView.reloadData() 
     }) 
    } 

我的問題是...

  1. 我已經看過其他的教程,幾乎是相同的,只寫簡單的數據,並用它填充的tableview,但其他教程只需使用.childadded作爲事件類型即可。我不明白爲什麼在本教程中使用.value事件類型?因爲它看起來更復雜。

  2. 爲什麼我們必須循環snapshot.children?是snapshot.children就像我們創建數據庫引用時的孩子一樣?

  3. 實際上,我對於term snapshot(FIRDataSnapshot)和reference(FIRDatabasereference)並不是很滿意。有沒有任何文章或視頻解釋這個詞?

對不起,如果我問了太多問題,看起來很傻,只是一個想要真正掌握這段代碼的菜鳥。在此先感謝

回答

0
  1. 當你觀察.value事件,你完成處理器被調用一次;帶有所有子節點的快照。這允許您一次處理所有子節點,這可以方便地執行更新計數器等事情,或者減少表視圖的更新次數。

  2. 當您通過.value事件觀察Firebase數據庫中的項目列表時,可能會有多個子節點。所以快照包含了這些結果的列表。即使只有一個子節點,快照也會包含一個子節點的列表。因此,您的完成處理程序需要遍歷這些結果,您可以通過遍歷snapshot.children來完成這些結果。

  3. A FIRDataSnapshot/DataSnapshot是一個Firebase對象,它包含您在特定時間請求的數據快照。