2016-06-09 2 views
0

이 질문은 수십 번 전에 물어 보았습니다.하지만 불행히도 저는 스위프트와 충분히 관련이 없으므로 문제를 해결할 수 없습니다.스위프트 - 진행하기 전에 "dataTaskWithRequest"응답을 기다리십시오.

기본적으로 서버의 PHP 스크립트로 POST 요청을 보내는 기능이 있지만 결과를 얻기 위해 내 스크립트보다 수신하는 데 오랜 시간이 걸리는 것처럼 보입니다. 숫자 변수를 보내고 응답으로 하나를받습니다. 그래서 'any_object'에서 'NSNumber'로 변환합니다. 완성 처리기를 구현해야한다는 것을 알고 있지만 아래 코드를 사용하는 방법을 알아낼 수 없습니다.

var dataResult: Int = 0 
var dataReceived: NSNumber? 

    func remoteRand() { 
     let dataToSend = 1 
     let myUrl = NSURL(string: "http://localhost/scripts/phpScript.php") 
     let request = NSMutableURLRequest(URL: myUrl!) 
     request.HTTPMethod = "POST" 
     let postString = "dataToSend =\(dataToSend)" 
     request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
      data, response, error in 

      dispatch_async(dispatch_get_main_queue()) { 

       if (error != nil) { 
        self.displayAlertMessage((error?.localizedDescription)!) 
        return 
       } 
       do { 
        let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary 

        if let parseJSON = json { 
         let dataReceived = parseJSON["dataValue"] 
         self.dataResult = (dataReceived as! NSNumber).integerValue 
         print("\(self.dataResult) is server response") 
        } 
       } catch { print(error)} 
      } 
     } 
     task.resume() 
     processResult() 
    } 

    func processResult() { 
     print(dataResult) 
    } 

내가 얻을 결과는 다음과 같습니다 완료가 확인되면

0 
1 is server response 

어떻게 내가 다음 함수로 진행하기 전에 응답을 기다리거나 다음 기능을 트리거해야합니까 하나?

미리 감사드립니다.

답변

0

작업이 호출 된 스레드와 다른 스레드에서 완료됩니다. 이는 네트워크 요청이 주 스레드에서 실행을 중지시키지 않도록 설계된 것입니다. 따라서 코드 블록은 비동기 적으로 전송되고 네트워크 요청이 완료되기 전에 processResult가 호출됩니다. 호출을 do 블록에 넣거나 호출 할 수있는 메소드에 클로저를 추가 할 수 있습니다.

func remoteRand(completion: (response: Int) ->()) { 

// your code 
// process JSON 
// get value 
completion(dataReceived) 
// is passed back, just like the dataTaskWithRequest method to your caller where you can set the property on self, etc. 
} 

어딘가에을 사용 : 빠른 응답

remoteRand { [weak self] (response) in 
    self?.dataResult = response 
} 
+0

감사합니다. 당신이 말하는 것을 이해하고 솔루션을 올바르게 구현했다고 생각하지만 인수가 필요하므로 remoteRand() 함수를 호출하는 다른 함수에 오류가 발생합니다. "호출 오류에서 매개 변수 # 1에 대한 인수가 없습니다". 나는 그것을 지나가는 어떤 것도 받아들이지 않는 것 같습니다. – Rhys

+0

당신이 그것을 호출하고 그것을 다시 입력하면, Xcode는 위와 같이 그것을 사용할 수있는 매개 변수에 대한 패턴을 자동 완성합니다. –

+0

당신의 마지막 코멘트를 읽은 후에 나는 당신이 말한 것을했습니다. 그리고 나는 그것이 모든 것을 완벽하게 이해했다고 생각한 순간을 가지고있었습니다. 그에 따라 응답 데이터를 받고 있지만 응답이 필요한 곳에서 동일한 문제가 발생합니다. 내가 시도한 것을 게시하고 싶지만 거의 오전 3시이며 자러 가야합니다. 내 문맥에 코드를 게시 할 수있는 방법이 있다면 크게 감사하겠습니다. 내가 다음 기회를 얻었을 때 나는 그것을 점검하고 내가 얼마나 가까이 있는지 볼 것이다. 건배 모든 당신의 인내를 위해 :) – Rhys

관련 문제