2016-07-27 12 views
1

から取得しました。そのため、APIエンドポイントから受け取ったJSONオブジェクトを返す必要がある関数があります。なんらかの理由で、この関数は常にresponse.result.valueを出力するときにAPIレスポンスを完全に含み、if文を入力してreturnJSONに代入しても、常にnilを返します。入力を感謝します!Swift:戻り値JSONを関数

func storeContact(name: String, number: String, apiToken: String) -> AnyObject? { 

var returnJSON: AnyObject? 

let contact = ["api_token" : apiToken, "name" : name, "number": number] 

Alamofire.request(.POST, "http://sample.app/api/v1/contact", parameters: contact, encoding: .JSON).responseJSON { (response) -> Void in 

    if let value = response.result.value { 

     returnJSON = value 

    } 
} 

return returnJSON 

} 
+3

なぜあなたは辞書にJSONを解析し、辞書を返さないのですか?また、POST要求から結果を受け取る前に 'returnJSON'を返していますので、それはゼロです。ブロックを使用する。 – NSNoob

+0

[Swam Closure with Alamofire with Network requests](http://stackoverflow.com/questions/25141829/swift-closure-with-alamofire)の使い方を参照してください。 – NSNoob

答えて

2

インターネットフェッチは常にいくつかの時間が必要なので、Alamofireは非同期呼び出しを使用します。完了ブロックAlamofire.requestは、storeContactの後に常にを呼び出します。そのこのような状況でクロージャを使用するのが一般的:

func storeContact(name: String, number: String, apiToken: String, completeonClosure: (AnyObject?) ->()) { 
    let contact = ["api_token" : apiToken, "name" : name, "number": number] 

    Alamofire.request(.POST, "http://sample.app/api/v1/contact", parameters: contact, encoding: .JSON).responseJSON { 
     response in 
     completeonClosure(response.result.value) 
    } 
} 

使用法:

storeContact("name", number: "number", apiToken: "apiToken") { 
    returnJSON in 
    print(returnJSON) 
} 
+1

伝説の、感謝の気持ちが伝わる! – frostfat