2016-06-27 5 views
1

기능을 실행하기 전에 response.response ?allHeaderFields 데이터를 기다려야합니다. 나는 그물을 검색했고 alamofire 요청에 "완료 처리기"를 추가하는 방법을 얻지 못했습니다. 또는 함수를 대기 상태로 만드는 다른 방법이있는 경우응답 대기 Alamofire swift

@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이

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) 
     } 
    } 
} 

전화 당신이 완료 후 전화를해야하는 saperate 방법을 쓸 수 있습니다 어디서나

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

또는에서 방법있다.

func afterResponse(responseData : AnyObject) 
{ 
    print("Done") 
    print(responseData) 
} 
당신은 작업이 동기 원인이 될,하지만 당신은 당신이 Alamofire 요청하기 전에 설정하는 것이 대한 세마포어를 사용하도록해야 할 것 그렇게하기 위해, 당신이 다음 완료 내에서 해제하는 수
+0

여전히 반환 된 데이터를 인쇄하기 전에 인쇄 기능 ("완료")을 인쇄하면 인쇄됩니다. – JuicyFruit

+0

예, 함수의 마지막에 print 메소드를 작성하면 게시물 요청을 실행 한 후 인쇄 메소드가 인쇄됩니다. 게시물 요청이 비동기 작업입니다. –

+0

문제 plz 점검에 대한 답변을 업데이트했습니다. –

0

매니저. 알라모 화재를 시작한 직후에 세마포어를 기다릴 것입니다.

+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) 
}