viewDidLoad,只调用一次吗?

Agu*_*ana 1 ios firebase swift firebase-realtime-database

我是iOS开发的初学者,我正在使用firebase数据库制作一个简单的聊天应用程序.其实我对viewDidLoad方法的使用感到困惑.

以下是该应用的屏幕截图:https://ibb.co/gqD4Tw

我不明白为什么retrieveMessage()法提上viewDidLoad时,我想发送数据(聊天消息)火力数据库,我使用的sendButtonPressed()方法(这是IBAction),当我想从数据库中检索数据,我用retrieveMessage().

retrieveMessage()调用该方法viewDidLoad,据我所知,该viewDidLoad方法只在视图加载到内存后调用一次.我们通常将它用于初始设置.

因此,如果viewDidLoad在初始设置中只调用一次,为什么在retrieveMessage()将消息数据发送到数据库之后,该方法可以一遍又一遍地检索我已经发送到我自己的数据库的所有消息?

我不明白为什么下面的retrieveMessage()方法是viewDidLoad简化代码:

class ChatViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {


    var messageArray = [Message]()

    @IBOutlet var messageTextfield: UITextField!
    @IBOutlet var messageTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        //Set as the delegate and datasource :
        messageTableView.delegate = self
        messageTableView.dataSource = self

        //the delegate of the text field:
        messageTextfield.delegate = self

        retrieveMessage()

        ///////////////////////////////////////////

    //MARK: - Send & Recieve from Firebase

    @IBAction func sendPressed(_ sender: AnyObject) {

    // Send the message to Firebase and save it in our database

    let messageDB = FIRDatabase.database().reference().child("message")
    let messageDictionary = ["MessageBody":messageTextfield.text!, "Sender": FIRAuth.auth()?.currentUser?.email]

        messageDB.childByAutoId().setValue(messageDictionary) {
            (error,ref) in

            if error != nil {
                print(error!)
            } else {
                self.messageTextfield.isEnabled = true
                self.sendButton.isEnabled = true
                self.messageTextfield.text = ""
            }   
        }
    }

    //Create the retrieveMessages method :

    func retrieveMessage () {
        let messageDB = FIRDatabase.database().reference().child("message")

        messageDB.observe(.childAdded, with: { (snapshot) in

            let snapshotValue = snapshot.value as! [String:String]

            let text = snapshotValue["MessageBody"]!
            let sender = snapshotValue["Sender"]!

            let message = Message()
            message.messsageBody = text
            message.sender = sender

            self.messageArray.append(message)

            self.messageTableView.reloadData()
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

Sun*_*rma 5

viewDidLoad 方法在ViewController生命周期中只调用一次.

retrieveMessage()调用原因是viewDidLoad因为它正在添加观察者以开始侦听已接收和已发送的消息.一旦收到或发送消息,则调用此块(观察者),然后在数组中添加该文本self.messageArray.append(message)并更新tableview.