Извлечение изображения из Firebase Storage, размещение в tableView не работает, - PullRequest
0 голосов
/ 07 апреля 2020

Мне удалось правильно отобразить изображение, когда у меня есть только изображение в ViewController. Я использовал этот код:

        islandRef.getData(maxSize: 1 * 1024 * 1024) { [weak self] data, error in
          if let error = error {
            print((error.localizedDescription))
            // Uh-oh, an error occurred!
          }
            if let data = data{
                self?.imageItem.image = UIImage(data: data)
            }

        }
    }

Я пробую аналогичный подход для моего tableView, но он немного сложнее. У меня есть два массива, которые извлекают строку и целое число из моего документа Firebase. Я добавляю их в массивы предметов и цен. Я могу показать эти значения в моем tableView. Я пытаюсь сделать то же самое, когда мой массив изображений. Я могу добавить изображение к нему. Затем я проверяю, есть ли массив картинок. Он имеет счет 1, но когда я пытаюсь получить к нему доступ в виде таблицы. Это говорит об ошибке: Поток 1: Неустранимая ошибка: Индекс выходит за пределы диапазона. Я не понимаю, почему мои другие массивы имеют значения, которые можно использовать, но этот массив делает. Я не думаю, что есть проблема с imageView, потому что я могу заменить изображения [indexPath.row] на мой PlaceholderImage, и он будет правильно показывать мое изображение-заполнитель.

class ProfileViewController: UITableViewController {
    var item = [String]()
    var prices = [Int]()
    var pricePicture = [Any]()
    var db:Firestore!
    var pictures = [UIImage]()
    let storage = Storage.storage()
    var placeholderImage = UIImage(named: "placeholder.jpg")
    var imageMenu:UIImage?

    override func viewDidLoad() {
        getData()


        let db = Firestore.firestore()
        super.viewDidLoad()

    }
    func getData(){

        let db = Firestore.firestore()
        let docRef = db.collection("wine").document("pinot-noir-2017")
        let storage = Storage.storage()
               docRef.getDocument(source: .server) { (document, error) in

                if let document = document {
                    let keys = document.data()?.keys
                       for key in keys!{
                        self.item.append(key)
                        self.pricePicture = document.data()![key] as! [Any]
                        self.prices.append(self.pricePicture[0] as! Int)


                        let stor = storage.reference()
                        let islandRef = stor.child("carbanet.jpg")
                        islandRef.getData(maxSize: 1 * 1024 * 1024) { [weak self] data, error in
                          if let error = error {
                            print((error.localizedDescription))
                          }
                            if let data = data{

                                self?.pictures.append(UIImage(data: data)!)

                                //this will print 1
                                print(self?.pictures.count ?? 0)
                            }
                        }

                        self.tableView.reloadData()

                        }
                   } else {
                       //print("Document does not exist in cache")
               }
        }
    }




    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return item.count
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Picture", for: indexPath)
        cell.textLabel?.text = item[indexPath.row] + "  $" + String(prices[indexPath.row])

        cell.imageView?.image = pictures[indexPath.row]

        return cell
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let detailViewController = storyboard?.instantiateViewController(identifier: Constants.Storyboard.detailViewController) as? DetailViewController{
            show(detailViewController, sender: .none)
        }

    }
}

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

1 Ответ

0 голосов
/ 07 апреля 2020

Я думаю, это потому, что я пытался сделать это внутри, пытаясь получить доступ к документу Firebase. Я сделал другую функцию getImage (), и на этот раз она сработала.

    func getImage(){

    let stor = storage.reference()
    let islandRef = stor.child("carbanet.jpg")

    islandRef.getData(maxSize: 1 * 1024 * 1024) { [weak self] data, error in
      if let error = error {
        print((error.localizedDescription))
        // Uh-oh, an error occurred!
      }
        if let data = data{

            self?.pictures.append(UIImage(data: data as Data)!)

            //this will print 1
            print(self?.pictures.count ?? 0)
        }
    }
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }
...