Работа с FireBase


#1

Приветствую
Пишу свое небольшое приложение
Его суть: загрузка данных из 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
}

}