Как заставить табличное представление загружать данные из Firebase Firestore после добавления массива в swift

#arrays #swift #firebase #google-cloud-firestore #tableview

#массивы #swift #firebase #google-cloud-firestore #просмотр таблицы

Вопрос:

У меня есть случай, когда я получаю данные из Firebase, помещаю их в массив и заполняю их в my Table View . Но Table View загружает данные до завершения функции для добавления данных в массив. Поэтому я всегда получаю Index out of range ошибку.

Если у вас, ребята, есть какое-либо другое решение для моего случая, не стесняйтесь исправлять мой код. Но на данный момент я могу придумать только способ, как заставить функцию добавлять данные в массив перед Table View его загрузкой.

Надеюсь, вы, ребята, понимаете, что я имею в виду.

Вот код:

 import UIKit
import FirebaseFirestore

var arrayCurrentProduct = [currentProduct]()
var arrayRetrievedData: [String:Any] = [:]
var arrayConvertedPrice: [String] = []

override func viewDidLoad() {
    super.viewDidLoad()
}

func initProduct(selectedProduct: String) {
    arrayCurrentProduct = referProduct(productName: selectedProduct)
}

private func referProduct(productName: String) -> [currentProduct] {
    switch productName {
    case Product.Microsoft.rawValue:
        getPrices(document: "Msft") { (_) in
            self.convertPrice(Type: "std")
            self.convertPrice(Type: "dc")
            self.tableView.reloadData()
            self.dismiss(animated: true, completion: nil)
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }
    default:
        break
    }
    return arrayCurrentProduct
}

private func getPrices(document: String, completion: @escaping (_ String:Any?) -> Void) {
    retrievePrice(document: document) { [weak self] (data) in
        guard let self = self else {return}
        self.arrayRetrievedData = data
        completion(self.arrayRetrievedData)
    }
}

private func convertPrice(Type: String) {
    formatterCode(formatter: formatter)
    var priceFormatted = ""
    guard let price = arrayRetrievedData[Type] else {return}
    if let formattedPrice = formatter.string(from: price as! NSNumber) {
        priceFormatted = formattedPrice
    }
    arrayConvertedPrice.append(priceFormatted)
}


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

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cellShowing = tableView.dequeueReusableCell(withIdentifier: ShowingTVCell.cellIdentifier, for: indexPath) as! ShowingTVCell
    let cellInput = tableView.dequeueReusableCell(withIdentifier: InputTVCell.cellIdentifier, for: indexPath) as! InputTVCell
    
    switch indexPath.section {
    case 0:
        cellShowing.labelName.text = microsoft[indexPath.row]
        cellShowing.labelPrice.text = arrayConvertedPrice[indexPath.row] // Error index out of range
        return cellShowing
    case 1:
        cellInput.labelSpec.text = microsoft[indexPath.row]
        return cellInput
    default:
        return cellShowing
    }
}
 

Вот немного о потоке:

Я выбираю продукт, initProduct() вызываемый -> referProduct() вызываемый -> получаю цену из Firebase -> конвертирую цену в валюту, добавляю в массив -> загружается Table View

Я также пытался вставить reloadData() некоторые места, но это не сработало. Любая помощь будет оценена.

Заранее спасибо.

Ответ №1:

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

Вы написали магическое число (4) перед выборкой данных. TableView пытается создать 4 строки на раздел без данных. Вы должны обновить возвращаемое значение numbersOfRowsInSection после получения данных.

Комментарии:

1. мой плохой, я не пропустил строку, я просто не поместил ее здесь. Я очень быстро обновлю код

2. Я также изменил свой ответ 🙂

3. человек, почему я не подумал об этом раньше. Я сделал такое количество строк, какое хотел, когда начинал проект. Спасибо, что спасли мой день!