等待呼叫Web服务的响应

时间:2018-06-13 05:47:22

标签: ios swift closures grand-central-dispatch

我有一个用于翻译的字符串数组,我想从这个翻译结果中为数组创建句子中的每个字符串调用Yandex翻译API,然后将这个句子在闭包中传递给控制器​​并更新UI。我想当我的句子在闭包中被传递完整的句子,但现在我检查了数组计数的索引,我想要一个更好的解决方案。

class TranslateService {
  private let myGroup = DispatchGroup()
  func translateText(text:[String],closure:@escaping ((_ success:String?,_ error:Error?) -> Void)) {

    var translateString: String = ""
    var responseError: Error?

    for index in 0...text.count - 1 {
      myGroup.enter()
      let urlString = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20171105T134956Z.795c7a0141d3061b.dc25bae76fa5740b2cdecb02396644dea58edd24&text=\(text[index])&lang=fa&format=plain&options=1"
      if let allowString = Utilities.shareInstance.getQueryAllowedString(url: urlString) {
        if let url = URL(string:allowString){
          Alamofire.request(url).responseJSON { response in
            guard let responseData = response.data else {
              return
            }
            do {
              let json = try JSONSerialization.jsonObject(with: responseData, options: [])
              if let res = json as? [String:Any] {
                if let code = res["code"] as? Int {
                  if code == 200 {
                    if let textArr = res["text"] as? [AnyObject] {
                      let flattArr = Utilities.shareInstance.flatStringMapArray(textArr)
                      if flattArr.count > 0 {
                        translateString += "،" + flattArr[0]
                      }
                    }
                  }
                }
              }
            }catch {
              responseError = error
            }

            if index == text.count - 1 {
              closure(translateString, responseError)
              self.myGroup.leave()
            }
          }
          self.myGroup.notify(queue: .main) {
            print("Finished all requests.")
          }
        }
      }

    }

  }
}

1 个答案:

答案 0 :(得分:1)

试试这个,绝对没有必要比较index.I你认为你误解了调度组的概念

<script src="paymentwebsite"
                data-error="errorCallback"
                data-cancel="cancelCallback"
                data-complete="completeCallback"
                data-beforeRedirect="beforeRedirect"
                data-afterRedirect="afterRedirect">
            </script>

    function completeCallback() {
        //A View Model Function or,
        //Use as validation before Knockout Submit binding

    }

仅当进入组的所有异步任务都离开块时,才会执行调度组通知块。所以你可以在notify块中执行你的闭包。这应该清楚地表明所有alamofire请求都已成功完成或出错。

希望这有帮助。