2016-07-12 1 views
0

루프에서 웹 서비스 호출을 중단하고 모든 단계에서 상태를 가져 오지 못하게하려고합니다.for 루프가 동기식 웹 서비스를 신속하게 호출합니다.

나는 아래의 코드로 시도했지만 모든 웹 서비스 호출이 대기열을 만든 것처럼 보입니다. 웹 서비스 호출 리턴이 실패하면 즉시 루프를 중단하고 싶습니다. API 동작은 async이며 루프 sync 방식으로 작동하기 때문에

//Call web services in loop 
    for Prop: Property in self.properties! 
    { 
     self.netUtil.callPostWebservice(unitUrl) {(dataDictionary) -> Void in 
      let status = dataDictionary[self.constants!.defaultsKeys.RESPONSE_STATUS] 
      if(status!.isEmpty || status==“FAIL”){ 
       break 
      } 
     } 
    } 

//Web service common function  
    func callPostWebservice(urlStr: String, callback: ((data: Dictionary<String,String>) -> Void)!) 
    { 
     let semaphore = dispatch_semaphore_create(0) 
     let request = NSMutableURLRequest(URL: NSURL(string: urlStr)!) 
     request.HTTPMethod = "POST" 
     request.addValue("application/xml", forHTTPHeaderField: "Content-Type") 
     request.addValue("application/xml", forHTTPHeaderField: "Accept") 
     request.timeoutInterval = 20000.0 

     var dict = Dictionary<String,String>() 
     let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
     dispatch_semaphore_signal(semaphore) 

     if error == nil{ 
      if data == nil{ 
       dict[self.constants.defaultsKeys.RESPONSE_STATUS] = self.constants.defaultsKeys.RESPONSE_FAIL 
       callback(data: dict) 
      } 
      else{ 

       dict[self.constants.defaultsKeys.RESPONSE_STATUS] = self.constants.defaultsKeys.RESPONSE_SUCCESS 
       callback(data: dict) 

      } 
     } 
     else{dict[self.constants.defaultsKeys.RESPONSE_STATUS] = self.constants.defaultsKeys.RESPONSE_FAIL 
      callback(data: dict) 
     } 

     }) 
     task.resume() 

    } 
+0

처럼이 메서드를 호출합니다. 첫 번째 웹 서비스에서 응답 성공을 얻은 다음 perform selector/dispatch functiopn을 사용하여 동일한 함수를 다시 호출하고 실패 할 경우 webservice를 호출하지 마십시오. –

답변

2

이 일어나고있다. 문제를 해결하려면 다음과 같이 해보십시오.

func getData() { 
    if (cnt < self.properties.count) { 
     let prop: Property = self.properties[cnt] 
     self.netUtil.callPostWebservice(unitUrl) {(dataDictionary) -> Void in 
      let status = dataDictionary[self.constants!.defaultsKeys.RESPONSE_STATUS] 
      if(status.isEmpty || status!=“FAIL”){ 
      { 
       cnt++ 
       self.getData() 
      } 
     } 
    } 
} 

지금 Int 유형의 cnt VAR에 생성하고 난 당신이 웹 서비스를 호출하는 선택/파견 functiopn을 수행 호출해야합니다 추측이 방법

cnt = 0 
self.getData()