2017-06-07 27 views
0

我都是新來的Firebase,並將它與Swift一起使用。我正在嘗試瞭解如何使用Firebase數據庫。與Firebase一起創建DataMan

通常當在Swift中處理數據時,我創建了一個DataManager,它處理data/database/api的所有工作,以便代碼被隔離並且不會在整個應用程序中混亂。

在TableViewController加載數據以後我可以只是像做

self.items = DataManager.shared.getItems() 

在以下不同的火力地堡的教程,我發現,在所有實例的所有數據處理都在ViewControllers本身造成。 For example this tutorial在TableViewController他們會碰到這樣的:

let ref = FIRDatabase.database().reference(withPath: "items") 

override func viewDidLoad() { 
    ref.observe(.value, with: { snapshot in 
     var newItems: [Item] = [] 

     for item in snapshot.children { 
      let newItem = Item(snapshot: item as! FIRDataSnapshot) 
      newItems.append(newItem) 
     } 
     self.items = newItems 
     self.tableView.reloadData() 
    }) 
} 

也許他們正在做這種方式,因爲這僅僅是一個例子,它更容易解釋。但我認爲這種方式會讓應用程序混亂,我寧願將這些東西移到DataManager中。

我一直在試圖理解如何以一種好的方式做到這一點,但我無法弄清楚。如何確保觀察者被移除等?你會怎麼做?有創建這種結構的好例子嗎?或者,這不是Firebase的工作方式嗎?

回答

0

您應該將completion handlers添加到您在數據管理器中的函數中。

像這樣:

override func viewDidLoad() { 
    super.viewDidLoad() 

    DataManager.getItems() { items in 
     // this part will be called, when data is loaded in DataManager 
     self.items = items 
     self.tableView.reloadData() 
    }) 
} 

DataManager FUNC:

static func getItems(completion: @escaping (_items: [Item]) -> Void) { 
    ref.observe(.value, with: { snapshot in 
     var newItems: [Item] = [] 

     for item in snapshot.children { 
      let newItem = Item(snapshot: item as! FIRDataSnapshot) 
      newItems.append(newItem) 
     } 

     completions(newItems) 
    }) 
} 

希望它可以幫助

+0

太好了!謝謝!但是,我什麼時候可以調用ref.removeObserverWithHandle(handle)來確保偵聽器被移除?還將引用在DataManager中,它將被幾個視圖控制器使用嗎? – Martin

+0

@Martin我從來沒有這樣做過。但我很確定,你可以在數據管理器中刪除觀察者。一切都應該沒問題。 :)如果它幫助標記爲答案請致電 –

+0

謝謝!但是什麼時候我應該啓動參考,何時應該將其刪除?由於ref現在在DataManager中,它可以同時在應用程序中的多個位置使用? – Martin

相關問題