问题描述
我目前正在从 firebase 检索数据,数据被放入一个 NSObject
然后是一个完成块.完成块内的项目存储为变量 userBinfos
.变量 userBinfos
只在完成块内工作我想在完成之外使用它
Im currently retrieving data from firebase the data is put inside an NSObject
and then a completion block. The item inside of the completion block is store as a variable userBinfos
. Variable userBinfos
only work inside of the completion block i want to use this outside of the completion
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
被调用.因此,将代码取决于异步方法的完成inside userBinfo { user in ... }
闭包.
The entire purpose of the completion
parameter of userBinfo
is to provide a mechanism for being informed when the asynchronous observeEventType
is called. So put code contingent upon the completion of that asynchronous method inside the userBinfo { user in ... }
closure.
如果在调用异步 completion
闭包之前部分 UI 没有意义,则让 viewDidLoad
配置 UI 以使其显式(可能显示UIActivityIndicatorView
或其他),然后在完成处理程序中删除那些东西.
And if part of the UI doesn't make sense until that asynchronous completion
closure is called, then have viewDidLoad
configure the UI to make that explicit (perhaps show a UIActivityIndicatorView
or whatever) and then remove that stuff inside the completion handler.
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
}
这篇关于在完成块之外使用变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!