0
ループ内のWebサービスの呼び出しを停止したい場合は、いずれかの段階でステータスが失敗します。ループで同期Webサービスを迅速に呼び出すためのブレーク
私は以下のコードで試しましたが、すべてのWebサービスコールが待ち行列を作成しているように見えます。 Webサービスコールのリターンが失敗した場合、すぐにループを中断したい。
//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()
}
のように、このメソッドを呼び出します。一度最初のWebサービスから応答が成功すると、perform selector/dispatch functiopnを使って同じ関数を呼び出し、失敗した場合はwebserviceを呼び出さないでください。 –