#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. человек, почему я не подумал об этом раньше. Я сделал такое количество строк, какое хотел, когда начинал проект. Спасибо, что спасли мой день!