我希望能够在块外使用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
}

10-05 20:48