Как мне получить данные из Firestore? - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь передать данные в мое табличное представление из моего облачного пожарного хранилища, но оно просто не может извлечь данные и опубликовать их в табличном представлении, и до сих пор большинство моих попыток были неудачными.так как я перехожу из базы данных в реальном времени в Firestore.

Я использовал несколько ресурсов в стеке, несколько раз реструктурировал свой код и теперь перешел к этому

.изображение моей коллекции в Firestore коллекция камина

  import Foundation

  class ProductList {
      var id: String?
      var name: String?
      var dispensaryName: String?
      var category: String?,
      var brand: String?
      var imageUrl: String?

      init(id: String?,
           name: String?,
           dispensaryName: String?,
           brand: String?,
           category: String?,
           imageUrl: String?) {

           self.id = id
           self.name = name
           self.dispensaryName = dispensaryName
           self.brand = brand
           self.category = category,
           self.imageUrl = imageUrl
      }

  }

  import UIKit

  class ProductListCell: UITableViewCell {

      @IBOutlet weak var productImage: UIImageView!
      @IBOutlet weak var dispensaryName: UILabel!
      @IBOutlet weak var productName: UILabel!
      @IBOutlet weak var categoryLabel: UILabel!
      @IBOutlet weak var categoryStrain: UILabel!

  }

  import UIKit
  import Firebase
  import FirebaseFireStore

  class ProductListController: UIViewController {

      @IBOutlet weak var productListTableView: UITableView!
      @IBOutlet weak var menuButton: UIBarButtonItem!

      var dbRef: DatabaseReference!

      var productSetup: [ProductList] = []

      override func viewDidLoad() {
         super.viewDidLoad()

         productListTableView.dataSource = self
         productListTableView.delegate = self

        self.productListTableView.rowHeight = UITableView.automaticDimension
          self.productListTableView.estimatedRowHeight = 363

          menuButton.target = self.revealViewController()
          menuButton.action =       #selector(SWRevealViewController.revealToggle(_:))
     self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())

          dbRef = Database.database().reference().child("products");
    //observing the data changes
          dbRef.observe(DataEventType.value, with: { (snapshot) in

        //if the reference have some values
              if snapshot.childrenCount > 0 {

            //clearing the list
                  self.productSetup.removeAll()

            //iterating through all the values
                  for producting in snapshot.children.allObjects as! [DataSnapshot] {
                //getting values
                      let productObject = producting.value as? [String: AnyObject]
                      let id  = productObject?["id"]
                      let name  = productObject?["name"]
                      let dispensaryName = productObject?["dispensaryName"]
                      let category = productObject?["category"]
                      let strain = productObject?["strain"]
                      let imageUrl = productObject?["imageUrl"]

            //creating artist object with model and fetched values
                      let massProducts = ProductList(id: id as! String?,
                                                name: name as! String?,
                                                dispensaryName: dispensaryName as! String?,
                                                category: category as! String?,
                                                strain: strain as! String?,
                                                imageUrl: imageUrl as! String?)

                      //appending it to list
                      self.productSetup.append(massProducts)
                  }

                  //reloading the tableview
                  print(self.productSetup)
                  self.productListTableView.reloadData()
              }
          })
      }
  }

  extension ProductListController: UITableViewDelegate, UITableViewDataSource {
      func numberOfSections(in tableView: UITableView) -> Int {
          return 1
      }
      func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
          return productSetup.count
      }

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

          let production: ProductList
         production = productSetup[indexPath.row]

          cell.productName.text = "\(String(describing: production.brand)): \(String(describing: production.name))"
          cell.dispensaryName.text = production.dispensaryName
          cell.categoryLabel.text = production.category
          cell.productImage.text = production.imageUrl
          return cell
      }
  }

1 Ответ

1 голос
/ 25 сентября 2019

Я быстро переформатировал код, чтобы его было легче понять, но это может быть одной из многих вещей;

  1. Проверка пользователя, аутентифицированного с помощью firebase на устройстве.
  2. Убедитесь, что вы правильно настроили параметры безопасности, чтобы разрешить чтение в firebase.

Переформатированный код

ProductListController.swift

import Firebase

class ProductListController: UIViewController {

    @IBOutlet weak var productListTableView: UITableView!
    @IBOutlet weak var menuButton: UIBarButtonItem!

    var productSetup = [ProductList]()

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

    override func viewDidLoad() {
        super.viewDidLoad()
        productListTableView.dataSource = self
        productListTableView.delegate = self

        productListTableView.rowHeight = UITableView.automaticDimension
        productListTableView.estimatedRowHeight = 363

        menuButton.target = self.revealViewController()
        menuButton.action = #selector(SWRevealViewController.revealToggle(_:))
        self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())

        fetchProducts { (products) in
            self.productSetup = products
            self.productListTableView.reloadData()
        }

    }

    func fetchProducts(_ completion: @escaping ([ProductList]) -> Void) {
    let ref = Firestore.firestore().collection("products")
    ref.addSnapshotListener { (snapshot, error) in
        guard error == nil, let snapshot = snapshot, !snapshot.isEmpty else {
            return
        }
        completion(snapshot.documents.compactMap( {ProductList(dictionary: $0.data())} ))
    }
}

}

extension ProductListController: UITableViewDelegate, UITableViewDataSource {

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

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "ProductListCell") as?
            ProductListCell else { return UITableViewCell() }

        cell.configure(withProduct: productSetup[indexPath.row])

        return cell
    }

}

ProductListCell.swift

import Firebase

class ProductListCell: UITableViewCell {

    @IBOutlet weak var productImage: UIImageView!
    @IBOutlet weak var dispensaryName: UILabel!
    @IBOutlet weak var productName: UILabel!
    @IBOutlet weak var categoryLabel: UILabel!
    @IBOutlet weak var categoryStrain: UILabel!

    func configure(withProduct product: ProductList) {
        productName.text = "\(String(describing: product.brand)): \(String(describing: product.name))"
        dispensaryName.text = product.dispensaryName
        categoryLabel.text = product.category

        fetchImage(withURL: product.imageUrl ) { (image) in
           productImage.image = image
      }
   }

   func fetchImage(withURL url: String, _ completion: @escaping (UIImage) -> Void) {
        let ref = Storage.storage().reference(forURL: url)
        ref.getData(maxSize: 1 * 1024 * 1024) { (data, error) in
            guard error == nil, let imageData = data, let image = UIImage(data: imageData) else {
                return
            }
            completion(image)
        }
    }


}

ProductList.swift

class ProductList {
    var id: String
    var name: String
    var dispensaryName: String
    var category: String
    var brand: String
    var imageUrl: String

    init(id: String, name: String, dispensaryName: String, brand: String, category: String, imageUrl: String) {

        self.id = id
        self.name = name
        self.dispensaryName = dispensaryName
        self.brand = brand
        self.category = category
        self.imageUrl = imageUrl
    }

    convenience init(dictionary: [String : Any]) {
        let id = dictionary["id"] as? String ?? ""
        let name = dictionary["name"] as? String ?? ""
        let dispensaryName = dictionary["dispensaryName"] as? String ?? ""
        let brand = dictionary["brand"] as? String ?? ""
        let category =  dictionary["category"] as? String ?? ""
        let imageUrl =  dictionary["imageUrl"] as? String ?? ""

        self.init(id: id, name: name, dispensaryName: dispensaryName, brand: brand, category: category, imageUrl: imageUrl)
    }

}

Надеюсь, вы нашли это полезным.

...