2016-06-27 17 views
1

機能を実行する前にresponse.response ?allHeaderFieldsデータを待つ必要があります。私はネットを検索して、alamofireリクエストに「補完ハンドラ」を追加する方法を得られませんでした。または、関数を待機させる他の方法がある場合。この応答待ちAlamofire swift

func postRequest(urlSuffix : String, params:[String : AnyObject]?, filterParams : [String]?, success: (response: AnyObject!) -> Void, failure: (error: NSError?) -> Void) 
{ 
    Alamofire.request(.POST, webServicesURLPrefix + urlSuffix, parameters: params, encoding: .JSON, headers: self.headers) 
    request?.responseJSON { response in 
     switch response.result 
     { 
     case .Success: 
      success(response: response.result.value) 
     case .Failure(let error): 
      failure(error: error) 
     } 
    } 
} 

よう

@IBAction func comfirmation(sender: UIButton) { 
    if CodeTextField.text != "" { 
     print("in comfirmation function") 
     let comfirmationRequestData = [ 
      "phone" : "\(appDelegate.savedNumber)", 
      "code" : "\(CodeTextField.text!)" 
     ] 
     Alamofire.request(.POST, 
      "http://192.168.214.241:4000/login", 
      parameters: comfirmationRequestData, 
      encoding: .JSON).responseJSON { 
       response in 
       switch response.result { 
       case .Success: 
        let jsonDecrypted = JSON(response.result.value!) 
        print(jsonDecrypted) 
        let headerFile = response.response?.allHeaderFields as? [String:String] 
        print(headerFile) 

       case .Failure(let error): 
        print(error) 
       } 
     } 
     print("in comfirmation function. success") 
     appDelegate.defaults.setValue(appDelegate.savedNumber, forKey: "phoneNumber") 
    } else { 
     print("in comfirmation function. failed") 
    } 

} 
+0

は、私はいくつかの時間前に作られた完成ハンドラの(http://stackoverflow.com/a/31264556/2227743)[ここでは一例です]。 – Moritz

+0

コールバックを使用して応答を取得します。理由は... –

答えて

4

使用Alamofireは

self.postRequest("do-registration.php", params: params, filterParams: nil, success: { (response) -> Void in 
     self.afterResponse(response) 
     }) { (error) -> Void in 
      failure(error: error) 
    } 

としてどこからでもメソッドを呼び出すか、あなたが完了した後に呼び出す必要がありますsaperateメソッドを書くことができます。

func afterResponse(responseData : AnyObject) 
{ 
    print("Done") 
    print(responseData) 
} 
あなたが操作を同期させ、しかし、あなたはAlamofire要求する前に設定し、そのためのセマフォを使用する必要があるとしていることを行うためには、あなたはその後、完成以内に放出することができます
+0

関数の最後にprint( "done")を追加すると、返されたデータが出力される前に印刷されます。 – JuicyFruit

+0

はい、関数の最後にprintメソッドを記述すると、ポストリクエストの実行後にprintメソッドが出力されます。ポストリクエストは非同期操作です –

+0

問題のplzチェックで自分の答えを更新しました。 –

0

ハンドラ。あなたはAlamoの火を発した直後にセマフォを待つでしょう。

+1

セマフォはディスパッチグループほど悪いです。 Alamofireの要求とNSURLSessionの要求は、非同期で動作するように設計されており、それに応じて処理されるはずです。 – vadian

+0

私はそれが良い考えだとは言わなかった、私は彼の要求に対処すると言いました。いいえ? – Feldur

0

セマフォを使用して動作するライブラリAlamofire-Synchronousがあります。

サンプル:

//json 
let response = Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]).responseJSON() 
if let json = response.result.value { 
    print(json) 
} 
関連する問題