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