Alamofire 요청이 데이터를 가져 오기까지 기다려야합니다. (오류 또는 값). 나는 Alamofire 함수가 for 루프 안에서 또 다른 함수로 호출되도록하기 때문에 Alamofire 요청은 두 번째 for 루프가 호출되기 전에 끝나야한다. 예를 들어; 첫 번째 루프 -> 첫 번째 요청 -> 두 번째 루프 -> 두 번째 요청 ... 등등. 이제 첫 번째 루프 -> 두 번째 루프 -> 모든 루프가 끝난 후에 요청 응답이 돌고 있습니다.DispatchGroup을 사용한 동기 Alamofire 요청
요청 기능 :
내가 전화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'호출을 꺼내서 위험을 피할 것을 제안합니다. 당신이 '떠나라'고 말하지 않은 처형의 길을 가졌던 것. 솔직히 말해서, 이것은 파견단을 전혀 사용하지 않아야하지만, 단지 FYI입니다. – Rob
나는 promisekit 보였지만 내 문제에 대한 올바른 방법인지 잘 모르겠습니다. –
아래에서는이 작업을 수행하는 방법에 대한 두 가지 방법을 간략히 설명했지만 PromiseKit은이 문제를 해결하는 또 다른 방법입니다. 핵심 아이디어는 다른 비동기 프로세스를 시작하기 전에 비동기 프로세스를 '대기'하고 싶지는 않지만 이전 패턴이 완료 될 때 비동기 적으로 한 요청을 트리거하는 데 이러한 패턴 중 하나를 사용하는 것입니다. 이렇게하면 스레드 차단이 방지되고 교착 상태 위험이 제거됩니다. – Rob