我试图从firebase实时数据库中获取用户名并将其显示在我的TableViewCell的标签中。我究竟做错了什么? userShortname.text仍然为空。我只使用电子邮件/密码验证 这是我的代码
{{1}}
答案 0 :(得分:0)
在退出self.tableView.reloadData()
关闭之前添加obserseSingleEvent
。例如:
profilePath.obserseSingleEvent(of: .value) { (snapshot) in
...
self.username = snapUsername
self.tableView.reloadData()
}
这将让您的tableView
知道网络响应已经到来;)
答案 1 :(得分:0)
<强> 1。 Firebase呼叫是异步
这意味着创建一个单独的线程来处理其分配的任务,主线程永远不会等待它继续进行下一个操作。
<强> 2。 iOS主线程
所有UI更新都通过主线程完成。永远不要运行冗长的任务,这需要花费更多的时间来完成这个线程。
Firebase执行完任务后,您需要将此信息传达给用户,因此需要进行UI更新。简单地写self.tableView.reloadData()
将始终有效 IF 所有内容都能与Firebase一起顺利运行;即使他们无法保证这一点:)
如果Firebase查询被挂起:
Blocks the main thread
----> Deem your app unresponsive
--> If unresponsive for a couple seconds, the watchdog kills your app.
为了避免这种情况,一旦Firebase的线程执行完毕并且您已将新数据添加到内存中,您需要告诉主线程执行任何相关的UI更新。
profilePath.obserseSingleEvent(of: .value) { (snapshot) in
...
self.username = snapUsername
DispatchQueue.main.async
{
self.tableView.reloadData()
}
}
我建议您熟悉iOS multi-threading并阅读this答案以了解冗长的任务操作。