2016-07-12 8 views
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() 

    } 
+0

のように、このメソッドを呼び出します。一度最初のWebサービスから応答が成功すると、perform selector/dispatch functiopnを使って同じ関数を呼び出し、失敗した場合はwebserviceを呼び出さないでください。 –

答えて

2

APIの動作がsync方法でループ作品のasyncしているので、これが起こっています。あなたの問題を解決するには、このようなものを試すことができます。

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に作成して、私はあなたがWebサービスを呼び出すために、セレクタ/ディスパッチfunctiopnを実行する呼び出す必要がありますね、このよう

cnt = 0 
self.getData() 
関連する問題