Мне нужно дождаться, пока запрос Alamofire завершит получение данных. (Ошибка или значение). Я вызываю функцию Alamofire внутри цикла for в другой функции, так что запросы Alamofire должны быть завершены до вызова второго цикла for. Например; первый цикл -> первый запрос -> второй цикл -> второй запрос... и так далее. Теперь идет первый цикл -> второй цикл -> и после того, как все циклы заканчиваются, запросы возвращаются.
Функция запроса:
func like(sender_id: String, completion: @escaping (String?) -> ()){
let group = DispatchGroup()
if let key = api_key{
let headers: HTTPHeaders = [
"X-Auth-Token": key,
"Accept": "application/json"
]
group.enter()
Alamofire.request(baseUrl + likeURL + sender_id, method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers).validate()
.responseJSON { (response) -> Void in
guard response.result.isSuccess else {
print("Error while doing : \(response.result.error)")
completion(nil)
group.leave()
return
}
if let error = response.error{
completion(nil)
group.leave()
print("Error Occured with Request: \(error)")
}
if let jsonData = response.data{
let json = JSON(data: jsonData)
print(json)
group.leave()
if let matched = json["match"].bool{
completion(matched.description)
print("Liked!: \(matched)")
if(matched){
}
}else{
group.leave()
"There is an error with JSON"
}
}}
}
}
Куда я звоню:
func like_all(completion: @escaping() -> ()){
for user in SharedUsers.sharedUser.users{
if let id = user.id{
Network.sharedInstance.like(sender_id: id) { result in
print(result)
}
}
else{
continue
}
}
completion()
}
leave
. Вы должны исправить это. Или, что лучше, если вы останетесь с этим шаблоном группы диспетчеризации, я бы предложил использоватьdefer { group.leave() }
в начале закрытия, а затем вытащить все остальные вызовыleave
, избегая любого риска иметь путь выполнения, где вы не можете вызватьleave
. Честно говоря, это спорный вопрос, так как вы вообще не должны использовать группу диспетчеризации, а просто к вашему сведению. - person Rob   schedule 08.12.2017wait
для какого-либо асинхронного процесса перед запуском другого, а используете один из этих шаблонов для асинхронного запуска одного запроса после завершения предыдущего. Это позволяет избежать блокировки потока (и устраняет любые риски взаимоблокировки). - person Rob   schedule 08.12.2017