簡體   English   中英

viewDidLoad,它僅被調用一次嗎?

[英]viewDidLoad, is it called only once?

我是iOS開發的初學者,我正在學習一個使用Firebase數據庫制作簡單聊天應用程序的教程。 實際上,我對使用viewDidLoad方法感到困惑。

這是該應用程序的屏幕截圖: https : //ibb.co/gqD4Tw

我不明白為什么retrieveMessage()方法被放置在viewDidLoad ,當我想發送數據(聊天消息)火力數據庫,我用sendButtonPressed()方法(這是一個IBAction ),當我想從數據庫中檢索數據,我使用retrieveMessage()

據我所知, viewDidLoad retrieveMessage()方法是在viewDidLoad上調用的,據我所知, viewDidLoad方法僅在視圖加載到內存后才被調用一次。 我們通常將其用於初始設置。

因此,如果在初始設置中僅調用一次viewDidLoad ,為什么在將消息數據發送到數據庫后, retrieveMessage()方法可以一次又一次地檢索所有發送到我自己的數據庫的消息?

我不明白為什么將viewDidLoad 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()
        })
    }
}

viewDidLoad方法在ViewController生命周期中僅被調用一次。

之所以在viewDidLoad調用retrieveMessage()是因為它添加了觀察程序以開始偵聽已接收和已發送的消息。 一旦您接收或發送消息,便會調用此塊(觀察者),然后將該文本添加到數組self.messageArray.append(message)並更新tableview。

viewDidLoad僅被調用一次,但是firebase函數啟動一個偵聽器,在后台工作並同步數據。 之所以在viewDidLoad中調用它是因為它告訴->該視圖加載時,開始偵聽消息。

僅在初始化ViewController時才調用ViewDidLoad() 如果您希望每次用戶再次查看該VC時都調用一個函數(例如,從另一個VC選回后),則可以使用ViewDidAppear() 調用ViewDidLoad()時也會調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM