Приветствую
Пишу свое небольшое приложение
Его суть: загрузка данных из Realtime Database + Storage из Firebase. Новостное приложение. Данные загружаются и изменяются напрямую из FireBase
Удалось реализовать, данные подгружаются, все идет хорошо
Но есть проблема. Если человек сидит в контроллере, куда загружаются данные, а в этот момент я изменю какое - либо значение в БД - будет использоваться значение по умолчанию из кода, а все записи пропадают (в случае опционального извлечения данных из БД). В случае принудительного извлечения данных - просто краш приложения, так как обнаруживает nil в массиве + ко всему, даже если приложение было закрыто, а в этот момент добавлена новость - сначала приложение крашнется, а при повторном заходе - новость отображается. Поэтому принудительное извлечение пришлось изменить на опциональное
В связи с этим не могу найти решение, как можно пофиксить эту проблему с некорректным отображением данных при редактировании или добавлении записи в БД в момент открытого контроллера. По сути, необходимо обновлять данные в контроллере при изменении в FireBase.
Буду благодарен за помощь шарящих в FireBase
Сам код контроллера:
import UIKit
import Firebase
import FirebaseUI
class NewsViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
var storage: StorageReference!
var ref: DatabaseReference!
var arrayTextNews = Array<String>()
var arrayImagesNewsSF = Array<StorageReference>()
var image: UIImage = UIImage(named: "0")!
var text: String = ""
override func viewDidLoad() {
super.viewDidLoad()
ref = Database.database().reference(withPath: "news")
storage = Storage.storage().reference(withPath: "news")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Load texts and images for news from Realtime Database
var count = 0
var array = Array<String>()
ref.observe(.value) { (snapshot) in
for _ in snapshot.children {
let snapshotValue = snapshot.value as! [String: AnyObject]
let text = snapshotValue["news\(count)"] as? String //if as! -> crashed, else if as? -> failed
array.append(text ?? "Failed") //if as! -> delete "?? "Failed""
count += 1
}
self.arrayTextNews = array
for img in 0...self.arrayTextNews.count - 1 {
let picRef: StorageReference = Storage.storage().reference(withPath: "news").child("\(img).jpg")
self.arrayImagesNewsSF.append(picRef)
}
self.arrayTextNews.reverse()
self.arrayImagesNewsSF.reverse()
self.tableView.reloadData()
}
}
// MARK: Navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard segue.identifier == "showDetailnews" else { return }
guard let DetailNewsVC = segue.destination as? DetailNewsTableViewController else { return }
guard let indexPath = tableView.indexPathForSelectedRow else { return }
DetailNewsVC.screenWidth = UIScreen.main.bounds.width
DetailNewsVC.text = arrayTextNews[indexPath.row]
DetailNewsVC.imageRF = arrayImagesNewsSF[indexPath.row]
}
}
extension NewsViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return arrayTextNews.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellNews") as! CustomNewsTableViewCell
cell.textNews.text = arrayTextNews[indexPath.row]
cell.imageNews.sd_setImage(with: arrayImagesNewsSF[indexPath.row])
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 485
}
}