我有一个用于翻译的字符串数组,我想从这个翻译结果中为数组创建句子中的每个字符串调用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.")
}
}
}
}
}
}
答案 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请求都已成功完成或出错。
希望这有帮助。