ios - Swift - 从 Firebase 获取数据并将其存储到数组中

标签 ios swift firebase firebase-realtime-database tableview

我正在尝试从 Firebase 数据库中获取条形列表并将其存储在数组中,以便可以在表格 View 中显示它。

我已配置 Firebase 并设法以字符串、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 结构变量中,然后将其附加到数组中并不是我想要继续的路径。

我需要一个解决方案来抓取所有条形图并以某种方式将它们添加到数组中(或任何其他方法将它们显示到 tableView 中)。

提前致谢。

最佳答案

我找到了解决这个问题的方法:

首先,我摆脱了结构并创建了一个类:

我的类(class)文件:

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
    }


}

关于ios - Swift - 从 Firebase 获取数据并将其存储到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40999864/

相关文章:

swift - 如果不调用 startUpdatingLocation,我可以从 LocationManager 获取当前位置吗?

reactjs - Firebase 错误 : No firebase app default has been created

ios - Firebase 观察者架构

ios - Swift 的 openURL 方法不会调用带有星号的电话 (iOS 8.4)

ios - 在 Swift 中如何将值传递给 API?

ios - Swift - IOS 中 Data 类型的 deviceToken 和可选 String 类型的 Fir InstanceID token 有什么区别?

ios - drawInRect 的颜色 :withAttributes:

ios - App Store发行国家/地区

ios - 在 UIViewController 之间传递 NSFetchedResultsController

iOS 等宽自定义字体