Попробуйте это, абсолютно не нужно сравнивать индекс. Я думаю, вы неправильно поняли концепцию группы диспетчеризации
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 {
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){
myGroup.enter()
Alamofire.request(url).responseJSON { response in
guard let responseData = response.data else {
myGroup.leave()
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]
}
}
}
}
}
myGroup.leave()
}catch {
responseError = error
myGroup.leave()
}
}
self.myGroup.notify(queue: .main) {
print("Finished all requests.")
closure(translateString, responseError)
}
}
}
}
}
}
Блок уведомлений группы диспетчеризации будет выполняться только тогда, когда все асинхронные задачи, которые вошли вгруппа покидает блок.Таким образом, вы можете выполнить свое закрытие в блоке уведомлений.Это должно дать четкое указание на то, что все запросы alamofire завершены либо успешно, либо с ошибкой.
Надеюсь, это поможет.