Приложение вылетает до загрузки данных Firebase при возврате на 1 экран - PullRequest
0 голосов
/ 06 апреля 2019

У меня небольшая проблема с функциональностью Firebase при извлечении данных и выходе из контроллера представления до фактической загрузки данных.Я понял, что если я нажму кнопку «Назад» в контроллере ДО того, как фактические данные будут загружены в VC, в моей консоли произойдет сбой, равный *** Terminating app due to uncaught exception 'InvalidPathValidation', reason: '(child:) Must be a non-empty string and not contain '.' '#' '$' '[' or ']''.Это происходит только в том случае, если я пытаюсь выйти слишком быстро в том случае, если пользователь хочет перейти куда-то еще до загрузки данных, в противном случае каждая функция работает отлично.

Я уже удалил наблюдателей для двух из моих функций Firebaseв viewDidDissapear, который помогает, так как вы не хотите оставлять наблюдателя открытым, но это не решает мою проблему сбоя.У меня также есть прогресс HUD, который показывает и удаляет после загрузки данных, но безуспешно.Ниже приведена 1 из моих функций Firebase, которые, например, извлекают данные.

func retrieveMessages() {
        let ref = Database.database().reference().child("locations").child(titleString)
        ref.observe(.childAdded) { (snapshot) in
            if snapshot.exists() {
                let snapshotValue = snapshot.value as! Dictionary<String,String>
                let text = snapshotValue["message"]!
                let sender = snapshotValue["username"]!
                let img = snapshotValue["userImage"]!
                let upvote = snapshotValue["upvote"]!
                let timestamp = snapshotValue["timestamp"]!
                let message = ChatMessage()
                message.msgTimestamp = timestamp
                message.messageBody = text
                message.sender = sender
                message.chatImageURL = img
                let upvoteInt = Int(upvote)
                message.upvoteString = upvoteInt!
                self.chatMessageArray.append(message)
                self.chatTable.reloadData()
                self.chatRoomScrollToBottom(animated: true)
                        }
                    }
                }

Моя следующая гипотеза - отключить кнопку «Назад» до полной загрузки данных?Это решило бы эту проблему, но мне интересно, есть ли способ остановить эту функцию или любую функцию FB, которую я запускаю, если я немедленно нажимаю кнопку возврата?Цени любую помощь.

1 Ответ

0 голосов
/ 06 апреля 2019

Может быть, вы можете попробовать выполнить следующее и прокомментировать вывод:

import UIKit
import Firebase

class FirebaseTableViewController: UITableViewController  {

    lazy var ref: DatabaseReference = Database.database().reference()
    var chatMessageArray: Array<ChatMessage> = []
    var messageRef: DatabaseReference!
    var titleString = ""    //TODO: Update this
    var chatTable: UITableView = UITableView() //TODO: Update this



    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        print(titleString) // TODO: Check that it dose not contain: '.' '#' '$' '[' or ']''
        messageRef = ref.child("locations").child(titleString)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        chatMessageArray.removeAll()
        messageRef.observe(.childAdded) { (snapshot) in
            self.createMessage(snapshot:snapshot)
        }
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)

        // removeAllObservers: Removes all observers at the current reference, but does not remove any observers at child references
        messageRef.removeAllObservers()
    }

    func chatRoomScrollToBottom(animated: Bool) {

    }

    func createMessage(snapshot: DataSnapshot) {
        guard let snapshotValue = snapshot.value as? Dictionary<String,String> else {
            print("Error with snapshotValue")
            return
        }
        guard let text = snapshotValue["message"],
            let sender = snapshotValue["username"],
            let img = snapshotValue["userImage"],
            let upvote = snapshotValue["upvote"],
            let timestamp = snapshotValue["timestamp"] else {
                print("Error with snapshotValue[''] values")
                return
        }
        let message = ChatMessage()
        message.msgTimestamp = timestamp
        message.messageBody = text
        message.sender = sender
        message.chatImageURL = img
        guard let upvoteInt = Int(upvote) else {
            print ("Error with pvoteInt")
            return
        }
        message.upvoteString = String(upvoteInt)
        self.chatMessageArray.append(message)
        self.chatTable.reloadData()
        self.chatRoomScrollToBottom(animated: true)
    }

}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...