如何将Firebase中的数据列表导入阵列

时间:2017-11-21 22:54:18

标签: ios swift firebase firebase-realtime-database

我是Swift的新手。我知道如何从Firebase获取单个数据,但是当我尝试将数据列表添加到数组中时,我没有得到错误或没有数据。请帮我。我几天来一直在努力。 我想将Firebase中的数据添加到数组中, 我创建了带有类别列表的json文件,并在firebase中导入。

我的JSON文件如下所示:

 {
  "Category" : [ {
    "categoryId" : "1",
    "imageName" : "cat_001.png",
    "title" : "CAT"
  }, {
    "categoryId" : "2",
    "imageName" : "dog_001.png",
    "title" : "DOG"
  }, {
    "categoryId" : "3",
    "imageName" : "fish_001.png",
    "title" : "FISH"
  }, {
    "categoryId" : "4",
    "imageName" : "bird_001.png",
    "title" : "BRID"
  }]
}

Firebase数据库看起来像 this

类别类看起来像这样

struct Category {

    private(set) public var title: String
    private(set) public var imageName: String


    init(title: String, imageName: String) {
        self.title = title
        self.imageName = imageName
    }
}

我使用自定义单元格来显示我的数据,这是我的自定义单元格类

class CategoryCell: UITableViewCell {

    @IBOutlet weak var categoryImage: UIImageView!
    @IBOutlet weak var categoryTitle: UILabel!

    func updateViews(category: Category){
        categoryImage.image = UIImage(named: category.imageName)
        categoryTitle.text = category.title
    }
}

我使用DataService类来获取数据,现在数据是硬编码的,并且工作正常。

  class DataService{
        static let instance = DataService()

// How to add data from firebase in here`?
        private let categories = [Category(title: "CAT", imageName: "cat_001"),
                                  Category(title: "DOG", imageName: "dog_001"),
                                  Category(title: "FISH", imageName: "fish_001")]

        func getCategories() -> [Category]{
            return categories

        }
    }

最后这是我的ViewController

class CategoriesVC: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var categoryTable: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        categoryTable.dataSource = self
        categoryTable.delegate = self
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: "CategoryCell") as? CategoryCell {
            let category = DataService.instance.getCategories()[indexPath.row]
            cell.updateViews(category: category)
            return cell
        }else{
            return CategoryCell()
        }
    }
}

我将来会添加更多类别。  使用硬编码数据,我的应用程序看起来像this,我希望使用来自firebase的数据获得相同的结果。

1 个答案:

答案 0 :(得分:1)

尝试这样,只需对tableview数据源使用Category的数组:

var tableData = [Category]()

然后在viewDidLoad中,设置一个firebase观察者,以便在firebase中的Category节点发生更改时更新该数组:

ref.child("Category").observe(.value, with: { snapshot in
    var newTableData: [Category] = []

    for category in snapshot.children {

        let dict = category.value as! [String: AnyObject]

        let title     = dict["title"] as! String
        let imageName = dict["imageName"] as! String

        let newCategory = Category(title: title, 
                               imageName: imageName)

        newTableData.append(newCategory)
    }

    self.tableData = newTableData
    self.tableview.reloadData()
})