Firebase仅加载一次数据并使用完成处理程序关闭

时间:2017-01-15 14:39:29

标签: ios swift firebase firebase-realtime-database

我决定使用Firebase作为我正在制作的应用的后端。我意识到的一件事是,一旦我的表视图数据被填充,与Firebase的网络连接就不会关闭。

有没有办法可以关闭连接,这样就不会耗尽我的用户数据?在我获取数据的代码中,我将其存储在本地,因此它仍然存在。

    class HomeTableViewController: UITableViewController{

    //firebase refrences
    var restaurantArray = [Restaurant]()

    var dataBaseRef: FIRDatabaseReference! {
        return FIRDatabase.database().reference()
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "Home"
        navigationItem.leftBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "menuIcon"), style: .plain, target: self, action: #selector(SSASideMenu.presentLeftMenuViewController))
        navigationItem.leftBarButtonItem?.setBackButtonBackgroundImage(#imageLiteral(resourceName: "backButton"), for: .normal , barMetrics: .default)

        tableView.backgroundView = UIImageView(image: UIImage(named: "Background"))
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        fetchRestaurants()
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    func fetchRestaurants(){
       dataBaseRef.child("AthensRestaurants/Restaurants").observe(.value, with: { (snapshot) in
            var results = [Restaurant]()

            for res in snapshot.children{
                let res = Restaurant(snapshot: res as! FIRDataSnapshot)
                results.append(res)
            }

            self.restaurantArray = results.sorted(by: { (u1, u2) -> Bool in
                u1.name < u2.name
            })
            self.tableView.reloadData()
            self.dataBaseRef.removeAllObservers()
    }) { (error) in
    print(error.localizedDescription)
    }
}
      // MARK: - Table view data source
      // MARK: - Table view data source

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return restaurantArray.count
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "restaurantsCell", for: indexPath) as! RestaurantsTableViewCell

        // Configure the cell...

        cell.configureCell(res: restaurantArray[indexPath.row])
        cell.backgroundColor = UIColor.clear
        cell.contentView.layer.borderColor = UIColor.clear.cgColor
        cell.contentView.layer.borderWidth = 1.5
        return cell
    }

    //transfers data to new page
    func showRestaurantViewControllerWith(_ res: Restaurant) {
        let storyBoard = UIStoryboard(name: "Main", bundle: nil)
        let destinationVC = storyBoard.instantiateViewController(withIdentifier: "RestaurantDetails") as! RestaurantDetailViewController
        destinationVC.resTransfer = res
        self.navigationController?.pushViewController(destinationVC, animated: true)
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        self.showRestaurantViewControllerWith(self.restaurantArray[indexPath.row])
    }











}

2 个答案:

答案 0 :(得分:2)

致电时:

dataBaseRef.child("AthensRestaurants/Restaurants").observe(.value

您开始观察数据库中Restaurants节点的值。您的代码块将立即使用当前值运行,然后在值更改时立即运行。因此,Firebase数据库客户端将保持与服务器的开放连接。

如果您不需要更新值,可以向观察者注册:

dataBaseRef.child("AthensRestaurants/Restaurants"). observeSingleEvent(of: .value

请参阅Firebase文档中的read data once

这将确保您只获得初始值,而不是等待更新。但是关闭连接可能还需要很长时间。

要自行明确管理连接的开启/关闭,您可以致电goOffline() / goOnline()。请参阅Firebase reference documentation for goOffline()

答案 1 :(得分:0)

我认为您应该使用以下方法,因此只加载一次数据:

dataBaseRef.child("AthensRestaurants/Restaurants").observeSingleEvent(of: .value, with: { (snapshot) in
 var results = [Restaurant]()

        for res in snapshot.children{
            let res = Restaurant(snapshot: res as! FIRDataSnapshot)
            results.append(res)
        }

        self.restaurantArray = results.sorted(by: { (u1, u2) -> Bool in
            u1.name < u2.name
        })
        self.tableView.reloadData()
        self.dataBaseRef.removeAllObservers()
  }) { (error) in
    print(error.localizedDescription)
}