//Just a struct to save information about the User
var user = AppUser()
override func viewDidLoad() {
super.viewDidLoad()
//Verify if user is logged in
verifyUser()
user.email = "blabla"
print("viewdidload user: \(user)")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(true)
print("viewdidappear user: \(user)")
}
func verifyUser() {
print("verify user called")
//Log in verification
guard let userID = Auth.auth().currentUser?.uid else {
perform(#selector(handleLogOut), with: nil, afterDelay: 0)
print("nil user")
return
}
ref.child("users").child(userID).observeSingleEvent(of: .value, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
self.user = AppUser(dictionary: dictionary)
print(self.user)
}
}) { (error) in
print(error.localizedDescription)
}
}
安慰:
verify user called
viewdidload user: AppUser(id: nil, name: nil, email:
Optional("blabla"), completedRegister: nil, FULLUser: nil)
viewdidappear user: AppUser(id: nil, name: nil, email:
Optional("blabla"), completedRegister: nil, FULLUser: nil)
AppUser(id: nil, name: nil, email: Optional("x@gmail.com"),
completedRegister: Optional(false), FULLUser: Optional(false))
问题很简单 . 有人可以解释"verify user called"和"the user"之间是否有可能用数据库信息打印 "print("viewDidLoad user:....")"
?
问题是,当我尝试在viewDidLoad上获取用户的信息时,由于某种原因,该函数没有获取信息,因此值仍为零 . 这是时间问题吗?
我尝试在函数verifyUser()之后放置一个循环,但它永远不会得到
out:
while user.email == nil {
print("Waiting...")
}
所以......这就是问题所在
谢谢!
编辑Anas Menhar这是我的结构 . 为什么成为NSObject会更好?我做了一个Struct,因为我可以做两个不同的inits(一个空),而NsObject由于某种原因没有让我
struct AppUser {
var id: String?
var name: String?
var email: String?
var completedRegister: Bool?
var FULLUser: Bool?
init(dictionary: [String: Any]) {
self.id = dictionary["id"] as? String
self.name = dictionary["name"] as? String
self.email = dictionary["email"] as? String
self.completedRegister = Bool((dictionary["completedRegister"] as? String)!)
self.FULLUser = Bool((dictionary["FULLUser"] as? String)!)
}
init() {
self.id = nil
self.name = nil
self.email = nil
self.completedRegister = nil
self.FULLUser = nil
}
}
为Hitesh编辑
如果我打印字典,它就会在用户完成信息的同时打印 . 一切都结束了 .
1 回答
问题是
viewDidLoad()
在打印"viewdidload user: \(user)"
之前调用verifyUser()
.verifyUser()
中的所有内容将在打印前完成(网络呼叫除外) .所以这是发生在你身上的一系列事件:
super.viewDidLoad()
verifyUser()
被调用在
verifyUser()
中的print语句
守卫声明在
verifyUser()
viewDidLoad()
中的print语句
super.viewDidAppear()
打印
super.viewDidAppear()
闭包内的.observeSingleEventOf内的所有内容都会在4之后的某个时刻发生 - 每当调用结束时 . 如果要在调用完成后执行某些操作,请将其放入闭包中 .
像这样:
我添加注释的位置是该请求完成时可能会调用的位置 .
附注:如果您打算使用Struct for AppUser,请确保您知道结构和类之间的差异 . 你可以有一个名为AppUser的类,它有两个不同的命令,如下所示: