2016-07-17 9 views
1

ブロック外の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 

示唆したように、私は完成にそれを入れているが、私はまだ変数を取得する方法がわかりません!

+0

何の契約を戻すために 'completion'を使用する非同期の必要性と値。ここで私の答えを参照することができますhttp://stackoverflow.com/questions/38113280/get-the-value-of-variable-out-of-closure-swift/38113412#38113412 – xmhafiz

+0

@ cod3rite私はあなたの他の投稿、しかし私はまだcurrentVoteの値を使用することはできません。変更は上記の私の質問にあります。お時間をいただき、ありがとうございました。私に完全な答えを教えていただければ幸いです。 –

+0

アクセスしたい変数にはアクセスできません。あなたのコントロールフローがそこにあるとき、それは準備ができません。準備ができたら、ブロック内の変数を使用して必要な処理を行う必要があります。 –

答えて

1

あなたはほぼ正しいです。しかし、ここで少し変更があなたがする必要がある:あなたがこのgetを呼び出したいとき

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 { 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 
} 
+0

Dershowitzありがとうございました。最後に、私は完了ハンドラを使用しませんでした、私はちょうどデータ取得の下に私のコードを置いた、何かこのようなやり方に間違っていますか?私のコードでは、Int値を1増加させ、現在保存されている値をJSONツリーに保存しました。 –

+0

問題は1つだけです。エラーが発生すると、JSONから返される「Int」がないため、コードは失敗します。 – Dershowitz123

+0

私はあなたの時間と助けに非常に感謝します。 –