[英]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.