私は、値の変更が表示されないという問題ではなく、むしろ非同期メソッドを扱っていることから生じる問題であると考えています。たとえば、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)
この完了ハンドラパターンを使用することにより、私たちは「どのように私は、非同期メソッドが実行されたときに知っている」問題を解決します。また、クロージャのパラメータとして必要なデータを渡すことで、データの範囲を可能な限り狭くしながら、グローバルの使用を削減することができます。
明らかに、あなたのケースで適切なものと一致するように、クロージャのパラメータを変更する必要があります。しかし、うまくいけば、これは基本的なアイデアを示す
出典
2016-07-05 15:35:03
Rob
ありがとうございました!完璧に働いた。 –