2016-07-05 14 views
1

Alamofireリクエストをしようとしていますが、必要な情報をJSONデータから取り出してグローバル変数に入れたいと思います。グローバル変数とAlamofireの問題

Ok、基本的に、別のSwiftファイルからvariableOneのデータにアクセスしようとしています。私が2つのSwiftファイルを作ったとしましょう。そのグローバル変数を印刷しようとすると、グローバル変数の値を編集した関数がありました。編集した値が表示されます。しかし、Alamofireを使うたびに、グローバル変数を編集しようとすると、他のSwiftファイルは変更された値を表示しません。ですから、Alamofireリクエストブロック内のグローバル変数を編集しようとすると、別のファイルから変数を出力するたびに変更が表示されません。

誰かがフレーズの良い方法を知っている場合は、修正してください。

答えて

1

私は、値の変更が表示されないという問題ではなく、むしろ非同期メソッドを扱っていることから生じる問題であると考えています。たとえば、functionを呼び出すとすぐに戻りますが、variableOneはすぐに更新されるのではなく、後で更新される可能性があります。この非同期応答クロージャが呼び出される前に、あなたがチェックしていると思います。

この「グローバル」(悪い考え方ですが)を使用するのではなく、自分で補完ハンドラパターンを採用すると、この問題は発生しません。

func function(completionHandler: (String?) ->()) { 
    Alamofire.request(.GET, "API URL").responseJSON { response in 
     if let rawJSON = response.result.value { 
      // Here I just take the JSON and put it into dictionaries and parse the data. 
      completionHandler(String("data")) 
     } else { 
      completionHandler(nil) 
     } 
    } 
} 

アンあなたがそうのようにこれを呼びたい:

function() { string in 
    // use `string` here 
} 

// but not here, because the above closure runs asynchronously (i.e. later) 

この完了ハンドラパターンを使用することにより、私たちは「どのように私は、非同期メソッドが実行されたときに知っている」問題を解決します。また、クロージャのパラメータとして必要なデータを渡すことで、データの範囲を可能な限り狭くしながら、グローバルの使用を削減することができます。

明らかに、あなたのケースで適切なものと一致するように、クロージャのパラメータを変更する必要があります。しかし、うまくいけば、これは基本的なアイデアを示す

+0

ありがとうございました!完璧に働いた。 –