3

私は Alamofire を使用しています。応答を受け取ったら、どこからでもアクセスできる変数として設定しようとしています。これが私が行ったものです

var data: NSData?
Alamofire.request(.POST, "http://localhost/api/notifications", parameters: parameters)
    .responseJSON { (request, response, JSON, error) in
           let data: AnyObject? = JSON
    }
println(data)

そして、それを実行するとnil....何かアイデアはありますか? 変数に代入しないとスコープ内のレスポンスが見えるので、リクエストが良いことはわかっています。

4

2 に答える 2

6

Almofire.request非同期関数です。あなたがそれを呼び出すと、すぐに返されます。実際にリクエストを行う前に。そのため、何かが 以外にprintln(data)設定される前に呼び出されます。リクエストが実際に完了すると、Alamofire は に渡したクロージャーを呼び出します。そのクロージャーは、実際に使用する場所です(印刷するなど)。datanilresponseJSONdata

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?

于 2014-11-10T01:55:23.583 に答える