Ios 在swift中中断循环以调用同步web服务
我想停止在循环中调用web服务,一旦它在任何阶段都获得失败状态 我试过使用下面的代码,但似乎所有的web服务调用都会生成一个队列,然后再调用。我想在任何web服务调用返回失败时立即中断循环Ios 在swift中中断循环以调用同步web服务,ios,swift2,Ios,Swift2,我想停止在循环中调用web服务,一旦它在任何阶段都获得失败状态 我试过使用下面的代码,但似乎所有的web服务调用都会生成一个队列,然后再调用。我想在任何web服务调用返回失败时立即中断循环 //Call web services in loop for Prop: Property in self.properties! { self.netUtil.callPostWebservice(unitUrl) {(dataDictionary) -> Void
//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服务
对于道具:self.properties中的属性!
{
self.netUtil.callPostWebservice(unitUrl){(dataDictionary)->中的Void
let status=dataDictionary[self.constants!.defaultsKeys.RESPONSE\u status]
if(status!.isEmpty | | status==“FAIL”){
打破
}
}
}
//Web服务公共功能
func callPostWebservice(urlStr:String,callback:((数据:Dictionary)->Void)!)
{
让信号量=dispatch\u信号量\u create(0)
let request=NSMutableURLRequest(URL:NSURL(string:urlStr)!)
request.HTTPMethod=“POST”
request.addValue(“应用程序/xml”,forHTTPHeaderField:“内容类型”)
request.addValue(“application/xml”,forHTTPHeaderField:“Accept”)
request.timeoutInterval=20000.0
var dict=字典()
让task=NSURLSession.sharedSession().dataTaskWithRequest(请求,completionHandler:{data,response,error->Void in
调度信号灯信号灯(信号灯)
如果错误==nil{
如果数据==nil{
dict[self.constants.defaultsKeys.RESPONSE\u STATUS]=self.constants.defaultsKeys.RESPONSE\u失败
回调(数据:dict)
}
否则{
dict[self.constants.defaultsKeys.RESPONSE\u STATUS]=self.constants.defaultsKeys.RESPONSE\u成功
回调(数据:dict)
}
}
else{dict[self.constants.defaultsKeys.RESPONSE\u STATUS]=self.constants.defaultsKeys.RESPONSE\u失败
回调(数据:dict)
}
})
task.resume()
}
之所以发生这种情况,是因为API行为是异步的,而for循环是以同步的方式工作的。为了解决你的问题,你可以尝试这样的方法
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()
}
}
}
}
之所以会发生这种情况,是因为API的行为是异步的,而for循环的工作方式是同步的。为了解决你的问题,你可以尝试这样的方法
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()
}
}
}
}
我想您应该调用performselector/dispatch函数来调用web服务。一旦您从第一个webservice获得响应成功,然后再次使用perform selector/dispatch Functionipn调用相同的函数,如果失败,请不要调用webservice。我想您应该调用perform selector/dispatch Functionipn来调用web service。一旦您从第一个webservice获得响应成功,然后再次使用perform selector/dispatch Functionipn调用相同的函数,如果失败,请不要调用webservice。