我希望能够在块外使用currentVote Int,其中currentVote是在类顶部定义的变量。
databaseRef.child("Jokes").child(currentKey).observeSingleEventOfType(.Value, withBlock: { (snapshot) in
if let currentNumber = snapshot.value! as? [String: AnyObject] {
let currentValue = (currentNumber["votes"] as? Int)!
self.currentVote = currentValue
}
})
//*Location* where i want to use currentVote with it's new value
位置是我要使用currentVote值的位置。当我在这里打印值时,返回nil,然后将返回期望值。当我在块内打印值时,我得到了期望值。我理解这是为什么,因为块是在主线程之外执行的,因此当我在块之外打印时,打印是在块之前执行的,所以它的值为nil。我知道要把它放到主线上你必须用
dispatch_async(dispatch_get_main_queue(), {
code
})
但是,我已经用许多不同的方式用这个分派调用嵌套了我的代码,但是还不能获得currentVote的新值。我搜索了堆栈溢出,用户建议在块外创建一个函数,然后在块内调用这个函数。但是,它们的功能包括
func printValue(value: Int) {
print(value)
}
如你所见,这对我来说毫无用处,因为我想用块外的值,而不是打印出来!
***根据Cod3rite建议修改代码****
func get(completion: (value: Int) -> Void) {
databaseRef.child("Jokes").child(currentKey).observeSingleEventOfType(.Value, withBlock: { (snapshot) in
if let currentNumber = snapshot.value! as? [String: AnyObject] {
let currentValue = (currentNumber["votes"] as? Int)!
self.currentVote = currentValue
completion(value: self.currentVote!)
}
})
}
//where I want to use currentVote
我已经按照建议完成了它,但是我仍然不知道如何获得变量!
最佳答案
你差点就搞定了。但这里有一些需要做的修改:
func get(completion: (value: Int) -> Void) {
databaseRef.child("Jokes").child(currentKey).observeSingleEventOfType(.Value, withBlock: { (snapshot) in
if let currentNumber = snapshot.value! as? [String: AnyObject] {
let currentValue = (currentNumber["votes"] as? Int)!
completion(value: currentValue)
}
})
}
现在,当您要调用此
get
时,请执行以下操作:get { value in
//Now you have your value retrieved from firebase and you can use it however you want.
print(value)
self.currentVote = value
//your other code
}