2017-01-15 24 views
1

私は作成しているアプリケーションのバックエンドとしてFirebaseを使用することに決めました。私が気づいたことの1つは、テーブルビューのデータが入力されると、Firebaseへのネットワーク接続が終了しないということです。Firebaseは、データを1回ロードし、完了ハンドラを使用して閉じます。

ユーザーデータが枯渇しないように接続を閉じる方法はありますか?データを取得するコードでは、ローカルに保存するので、まだそこに保存されます。

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]) 
    } 











} 
+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()を参照してください。

+0

どこに機能を置くのですか?今でもテーブルをロードするためにデータを使用していることを変更した後でも、私はviewdidLoadにメソッドを配置する必要がありますか? –

+0

接続を閉じる場合は、表示するすべてのデータをロードした後で、最初の機会になります。私はそれがいつあるかを知る方法がありませんが、最初に '.value'イベントを処理した後のコールバックブロックのどこかにあると思います。 –

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) 
} 
関連する問題