Swift 在完成块之外使用变量
Im当前正在从firebase检索数据。数据被放入一个Swift 在完成块之外使用变量,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,Im当前正在从firebase检索数据。数据被放入一个NSObject中,然后放入一个完成块。完成块内的项存储为变量userBinfos。变量userBinfos仅在完成块内部工作我想在完成块外部使用它 var userBinfos = userObject() override func viewDidLoad() { super.viewDidLoad() userBinfo { (user) in self.userBinfos =
NSObject
中,然后放入一个完成块。完成块内的项存储为变量userBinfos
。变量userBinfos
仅在完成块内部工作我想在完成块外部使用它
var userBinfos = userObject()
override func viewDidLoad() {
super.viewDidLoad()
userBinfo { (user) in
self.userBinfos = user
}
//I want to use to variable here but it does not work
print(self.userBinfos.email)
}
func userBinfo(completion: (userObject) -> ()) {
let dbFir = FIRDatabase.database().reference()
let firRef = dbFir.child("frontEnd/users/\(userId)")
firRef.observeEventType(.Value, withBlock: { snapshot in
let userDict = snapshot.value as! [String: AnyObject]
self.name.text = userDict["firstname"] as? String
self.userBio.text = userDict["userBio"] as! String
var user = userObject()
user.firstName = userDict["firstname"]
user.lastName = userDict["lastname"]
user.email = userDict["email"]
user.profileImageUrl = userDict["profileImageUrl"]
user.userBio = userDict["firstname"]
user.userId = userDict["firstname"]
dispatch_async(dispatch_get_main_queue(), {
completion(user)
})
}) { (error) in
print(error)
}
}
userBinfo
的completion
参数的全部目的是提供一种机制,用于在调用异步observeEventType
时获得通知。因此,在userBinfo{user in…}
闭包中,根据异步方法的完成情况编写代码
如果UI的一部分在调用异步的完成
闭包之前没有意义,那么让viewDidLoad
配置UI使其显式(可能显示UIActivityIndicatorView
或其他内容),然后在完成处理程序中删除该内容
override func viewDidLoad() {
super.viewDidLoad()
// do whatever you want to let the user know that something asynchronous
// is happening, e.g. add a spinning `UIActivityIndicatorView` or whatever
userBinfo { user in
self.userBinfos = user
// Update the UI here, including removing anything we presented to let
// the user know that the asynchronous process was underway. If you were
// dealing with UITableView`, you'd call `tableView.reloadData()` here.
}
// but not here
}
您正在区块外调用print(self.userBinfos.email)!!将它放在内部:userBinfo{(user)in},因此在块
observeEventType
分配之前调用它,这意味着在viewDidLoad
完成之后调用完成块。将要在完成块之外执行的代码放入块中,就完成了。