取得

2017-04-14 5 views
0

を動作していないコールバック関数からの値私はNSDictionaryのを返すコールバック関数を持っている:取得

override func viewDidLoad() 
{ 
    super.viewDidLoad() 


    var nd: NSDictionary = [:] 
    parseJSON(callback: {dict in 
     nd = dict 
     //print(nd)  This one prints the filled dictionary correctly 
    }) 
    //print(nd)  This one prints an empty dictionary 

} 

私は「ND」のコールバック関数から返された値を格納したいのですが、コールバックの外側print文まだ空のNSDictionaryを印刷しています。

私はここで間違っていますが、どうすれば修正できますか?

EDIT:

var nd: NSDictionary! = nil 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     loadData() 
     print(self.nd) 
    } 

    func loadData() 
    { 
     parseJSON(callback: {dict in 
      self.nd = dict 
      print(self.nd) 
     }) 
    } 

私はこれにそれを変更し、その機能は、そのロードが完了した後、印刷します。ただし、viewDidLoad()のprintステートメントはloadData()の前に印刷し、viewDidLoad()のprintステートメントはnilを出力します。なぜこれが起こり、具体的に変更する必要がありますか?

+0

このスレッドへの私の答えを見てください:http://stackoverflow.com/questions/41209804/waiting-for-asynchronous-function-call-to-complete/41209941#41209941 –

+0

parseJSON()は非同期関数です。それはあなたがそれを行うように依頼した作業が完了する前にすぐに戻ります。作業が終了すると、渡されたコールバックを呼び出します。コールバック関数の中カッコ内にデータを取得するコードを置く必要があります。 –

+0

@DuncanC情報をありがとう。私の編集を参照してください、あなたは説明できますか? –

答えて

0

parseJSONはバックグラウンドで実行され、のviewDidLoadメソッドの終了後にのみ完了することがあります。したがって、ndはコール直後に空のままです。

私の提案:内部前述のコールバック辞書の処理ロジックを追加(およびその変数外のごviewDidLoad方法に結果をコピーします)。

+0

viewDidLoadメソッドの外側で "nd"を初期化し、別のメソッドで外部にアクセスする必要がありますか?どうすれば修正できますか? –

+0

あなたはそれを行うことができますが、正確なタイミングは正しいことが難しいかもしれません。あなたの最善の策はあなたのロジック*を実際のコールバックの中に追加することです。 –

+0

ありがとうございます。私はおそらく私のロジックをコールバック内で動作させることができますが、コールバック関数の外でデータを取得することは可能ですか? –