从块Swift中提取值

时间:2016-07-17 14:47:24

标签: swift multithreading firebase firebase-realtime-database

我希望能够在块之外使用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。我知道要将它放到主线程上你必须使用

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

我按照建议将其完成,但我仍然不知道如何获取变量!

1 个答案:

答案 0 :(得分:1)

你几乎做对了。但是这里需要做一些修改:

=LARGE(A1:A9,INT((COUNT(A1:A9)/2)+0.5))

现在,当您想要调用此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