ブロック外の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
示唆したように、私は完成にそれを入れているが、私はまだ変数を取得する方法がわかりません!
何の契約を戻すために 'completion'を使用する非同期の必要性と値。ここで私の答えを参照することができますhttp://stackoverflow.com/questions/38113280/get-the-value-of-variable-out-of-closure-swift/38113412#38113412 – xmhafiz
@ cod3rite私はあなたの他の投稿、しかし私はまだcurrentVoteの値を使用することはできません。変更は上記の私の質問にあります。お時間をいただき、ありがとうございました。私に完全な答えを教えていただければ幸いです。 –
アクセスしたい変数にはアクセスできません。あなたのコントロールフローがそこにあるとき、それは準備ができません。準備ができたら、ブロック内の変数を使用して必要な処理を行う必要があります。 –