Almofire.request
非同期関数です。あなたがそれを呼び出すと、すぐに返されます。実際にリクエストを行う前に。そのため、何かが 以外にprintln(data)
設定される前に呼び出されます。リクエストが実際に完了すると、Alamofire は に渡したクロージャーを呼び出します。そのクロージャーは、実際に使用する場所です(印刷するなど)。data
nil
responseJSON
data
Alamofire.request(.POST, "http://localhost/api/notifications", parameters: parameters)
.responseJSON { (request, response, JSON, error) in
let data: AnyObject? = JSON
// do something useful with data
println(data)
}
コメントからの質問:
しかし、そのデータをテーブルに変換したいとしましょう。すべてのテーブル コードをクロージャ内に配置しますか?
すべてのコードをクロージャー内に配置することもできますが、おそらくすぐに面倒になります。これを処理するより良い方法は、使用しているのと同じ種類のパターンを実装することAlamofire.request
です。基本的に、リクエストを独自の関数にして、パラメーターとしてクロージャーを取ります。次に、に渡すクロージャーで、それを渡すresponseJSON
関数に渡されたクロージャーを呼び出しますdata
。次に、「そのデータをテーブルに変換する」別の関数を作成しdata
、クロージャーから呼び出します。このようなもの:
func callSomeAPI(resultHandler: (data: AnyObject?) -> ()) -> () {
Alamofire.request(.POST, "http://localhost/api/notifications", parameters: parameters)
.responseJSON { (request, response, JSON, error) in
let data: AnyObject? = JSON
resultHandler(data)
}
}
func makeTable(data: AnyObject?) -> () {
// make your table
}
callSomeAPI() { data in
makeTable(data)
}
注:おそらく、ある時点data
以外のものに変換したいと思うでしょう。AnyObject?