2016-12-06 25 views
0

Firebaseデータベースから棒のリストを取得し、配列に格納してテーブルビューで表示できるようにしようとしています。Swift - Firebaseからデータを取得し、配列に格納します。

私はFirebaseを設定して、アプリケーションのデータをString、AnyObject辞書として取得しました。ここで

は私のコードです:ここでは

struct Bar { 

    var latitude: Double? 
    var longitude: Double? 
    var name: String! 
    var phoneNumber: String? 
    var happyHour: String? 
    var url: NSURL? 
    var barLogo: UIImage? 
    var followers: Int? 
    var addedToFavorites: Int? 
    var zipCode: Double? 
    var area: String? 

} 


class ViewController: UIViewController { 

    var ref: FIRDatabaseReference! 
    var refHandle: UInt! 

override func viewDidLoad() { 
     super.viewDidLoad() 

     ref = FIRDatabase.database().reference() 
     refHandle = ref.observe(FIRDataEventType.value , with: {(snapshot) in 
      let dataDict = snapshot.value as! [String : AnyObject] 



     } 
     ) 
} 

がFirebaseからエクスポートされた私のJSONです:

{ 
    "data" : { 
    "bars" : { 
     "bar1" : { 
     "addedToFavorites" : 0, 
     "area" : "upper east", 
     "follwers" : 0, 
     "happyHour" : "m-f 16-19", 
     "lattitude" : 4412334, 
     "longitude" : 223455, 
     "name" : "bar1", 
     "phone" : 212222, 
     "url" : "http://www.bar1.com", 
     "zipCode" : 12345 
     }, 
     "bar2" : { 
     "addedToFavorites" : 0, 
     "area" : "upper west", 
     "follwers" : 0, 
     "happyHour" : "f - s 20-22", 
     "lattitude" : 4443221, 
     "longitude" : 221234, 
     "name" : "bar 2", 
     "phone" : 215555, 
     "url" : "http://www.bar2.com", 
     "zipCode" : 54321 
     } 
    } 
    } 
} 

このための最善の方法でしょうか?

私はそれを拡大縮小して何百ものバーをダウンロードしたいので、手動で辞書からデータを取得し、それをBar構造変数に格納してそれを配列に追加するのは、私が進めたいパスではありません。

私はすべてのバーをつかんで、何とかそれらを配列(またはテーブルビューに表示するための他の方法)に追加するソリューションが必要です。

ありがとうございます。

答えて

0

私は、この問題を解決する方法を見つけました:

私は構造体を取り除くとクラスを作成しましたまず第一に:

マイクラスファイル:

import Foundation 
import UIKit 

    class Bar { 

     private var _name: String! 
     private var _area: String! 
     private var _latitude: Double! 
     private var _longitude: Double! 
     private var _followers: Int! 
     private var _happyHour: String! 
     private var _phone: Double! 
     private var _url: String! 
     private var _zipCode: Double! 
     private var _addedToFav: Int! 

     var name: String! { 
      return _name 
     } 

     var area: String! { 
      return _area 
     } 

     var latitude: Double! { 
      return _latitude 
     } 

     var longitude: Double! { 
      return _longitude 
     } 

     var followers: Int! { 
      return _followers 
     } 

     var happyHour: String! { 
      return _happyHour 
     } 

     var phone: Double! { 
      return _phone 
     } 

     var url: String! { 
      return _url 
     } 

     var zipCode: Double! { 
      return _zipCode 
     } 

     var addedToFav: Int! { 
      return _addedToFav 
     } 



     init(name: String,area: String! , latitude: Double, longitude: Double, followers: Int, happyHour: String, phone: Double, url: String, zipCode: Double, addedToFav: Int) { 
      self._name = name 
      self._area = area 
      self._latitude = latitude 
      self._longitude = longitude 
      self._followers = followers 
      self._happyHour = happyHour 
      self._phone = phone 
      self._url = url 
      self._zipCode = zipCode 
      self._addedToFav = addedToFav 
     } 

     init(barData: Dictionary<String, AnyObject>) { 


      if let name = barData["name"] as? String { 
       self._name = name 
      } 

      if let area = barData["area"] as? String { 
       self._area = area 
      } 

      if let latitude = barData["lattitude"] as? Double { 
       self._latitude = latitude 
      } 

      if let longitude = barData["longitude"] as? Double { 
       self._longitude = longitude 
      } 

      if let followers = barData["followers"] as? Int { 
       self._followers = followers 
      } 

      if let happyHour = barData["happyHour"] as? String { 
       self._happyHour = happyHour 
      } 

      if let phone = barData["phone"] as? Double { 
       self._phone = phone 
      } 

      if let url = barData["url"] as? String { 
       self._url = url 
      } 

      if let zipCode = barData["zipCode"] as? Double { 
       self._zipCode = zipCode 
      } 

      if let addedToFav = barData["addedToFavorites"] as? Int { 
       self._addedToFav = addedToFav 
      } 
     } 


    } 

を私はDataServiceの作成シングルトンを持つクラス

データサービスクラスファイル:

import Foundation 
import Firebase 

let URL_BASE = FIRDatabase.database().reference() 

class DataService { 

    static let ds = DataService() 

    private var _REF_BASE = URL_BASE 
    private var _REF_BARS = URL_BASE.child("data").child("bars") 



    var REF_BASE: FIRDatabaseReference { 
     return REF_BASE 
    } 

    var REF_BARS: FIRDatabaseReference { 
     return _REF_BARS 
    } 
} 

そして、私の変更のViewControllerファイル(私はtableViewControllerを使用しなかった)

class ViewController: UIViewController , UITableViewDelegate , UITableViewDataSource { 

    @IBOutlet weak var myTableView: UITableView! 

    var baruri = [Bar]() 



    override func viewDidLoad() { 

     super.viewDidLoad() 
     myTableView.dataSource = self 
     myTableView.delegate = self 


     DataService.ds.REF_BARS.observe(.value, with: { (snapshot) in 

      if let snapshot = snapshot.children.allObjects as? [FIRDataSnapshot] { 
       for snap in snapshot { 
        print(snap) 
        if let barData = snap.value as? Dictionary<String, AnyObject> { 
         let bar = Bar(barData: barData) 
         self.baruri.append(bar) 
         print(self.baruri) 
         self.myTableView.reloadData() 
        } 
        self.myTableView.reloadData() 
       } 
       self.myTableView.reloadData() 
      } 
      self.myTableView.reloadData() 
     } 


     ) 

    } 

    func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return baruri.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = self.myTableView.dequeueReusableCell(withIdentifier: "newCell", for: indexPath) as! NewCell 

     var baruriTabel: Bar! 

     baruriTabel = baruri[indexPath.row] 

     cell.barNameLBl.text = baruriTabel.name 
     cell.followersNrLbl.text = String(baruriTabel.followers) 
     cell.areaLbl.text = baruriTabel.area 
     cell.addedToFavoritesLbl.text = String(baruriTabel.addedToFav) 
     cell.happyHourLbl.text = baruriTabel.happyHour 
     cell.urlLbl.text = baruriTabel.url 
     cell.lattitudeLbl.text = String(baruriTabel.latitude) 
     cell.longitudeLbl.text = String(baruriTabel.longitude) 
     cell.phoneLbl.text = String(baruriTabel.phone) 
     cell.zipCode.text = String(baruriTabel.zipCode) 

     return cell 
    } 


} 
関連する問題