我正在尝试使用此代码(在viewdidload
中声明)从Firebase数据库中检索Childs
let rootRef = FIRDatabase.database().reference().child("UsersInfo").child((FIRAuth.auth()?.currentUser?.uid)!)
rootRef.observeEventType(FIRDataEventType.Value, withBlock: { (snapshot) in
let hello = snapshot.value as! [String : AnyObject]
let usernamerecieved = hello["Username"] as! String
let Emailrecieved = hello["Email"] as! String
let bloodtyperecieved = hello["BloodType"] as! String
globalusername = usernamerecieved (EDITED)
})
我已经宣布了一个全局变量
var globalusername = "user"
我试图提取usernamerecieved
变量并将其转换为全局变量。但是,当我稍后在viewdidLoad
中打印全局变量时,我仍然得到globalusername
的初始值,即“user”。
答案 0 :(得分:0)
observeEventType的块是异步的,当你读取globalusername var时,该块可能还没有完成。
尝试在块内打印globalusername并查看值
答案 1 :(得分:0)
在这行代码中:usernamerecieved = globalusername
你在这一行中所做的是你将usernamerecieved的值设置为globalusername的值,即'user'
它应该是globalusername = usernamerecieved
。
有时需要花费时间从服务器检索数据的原因可能很多 - 网络连接速度慢,图像等重要数据检索等但在完成之前(从服务器检索动作)可能有线在你打印globalusername
之前,首先调用dispatch_async
被调用,甚至在完成后,关闭observeEventType甚至完成(因为它是异步的,有点类似于globalusername
)。为了解决这个问题,你应该调用打印调用addObserver
位于completionBlock中,或globalusername
使用globalusername
来查看其价值的任何变化,只要Product ID | Product Name | Qty | Price
-----------------------------------------------------
1 | Adidas | 1 | $50 | Delete Btn
的值被更改或更新,就会通知您你可以采取相应的行动。