Ios 在swift中中断循环以调用同步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

我想停止在循环中调用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服务
对于道具: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。