ID 속성이있는 User 클래스가 있습니다. 이 클래스 (ID 값)를 충족시키는 Alamofire 요청을 수행합니다. 버튼을 누르면 사용자 ID를 보내는 또 다른 Alamofire 요청을합니다. 첫 번째 요청에서 7 명의 사용자를 얻었으므로 두 번째 요청은 7 번 완료되었습니다. 버튼을 두드리면 버튼을 두드리면 첫 번째 요청 -> 두 번째 요청 (7 번) -> 첫 번째 req -> 두 번째 req (7 번) .....해야합니다. 첫 번째 요청이 완료 될 때까지 대기하고 두 번째 요청이 모두 대기되도록합니다. 이 일을하는 동안 최선의 방법은 무엇입니까? 그룹을 만들려고 생각하고 있지만 확실하지 않습니다.두 개의 Alamofire 함수를 하나씩 호출하십시오.
func cont_like(){
for var i in 0..<3{
let group = DispatchGroup()
let group2 = DispatchGroup()
group2.enter()
group.enter()
Network.sharedInstance.like_all(completion: {
group.leave()
})
group.enter()
Network.sharedInstance.get_rec(completion: {response in
print(response)
group.leave()
})
group.notify(queue: .main){
print("Both Req Done")
group2.leave()
}
}}
두 번째 요청 :
func like(sender_id: String, completion: @escaping() ->()){
if let key = api_key{
let headers: HTTPHeaders = [
"X-Auth-Token": key,
"Accept": "application/json"
]
Alamofire.request(baseUrl + likeURL + sender_id, method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers).responseData(completionHandler: { (response) in
let jsonData = JSON(response.data!)
guard response.result.isSuccess else {
print("Error while fetching tags: \(response.result.error!)")
return
}
if let error = response.error{
print("Error Occured with Request: \(error)")
}
if let matched = jsonData["match"].bool{
print("Liked!: \(matched)")
if(matched){
}
}else{
print("There is an error with liking :(")
}
})
}
}
먼저 요청 : 모든 Functon처럼
func get_rec(completion: @escaping (String?) ->()){
if let key = api_key{
let headers: HTTPHeaders = [
"X-Auth-Token": key,
"Accept": "application/json"
]
Alamofire.request(baseUrl + recom, method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers).responseData(completionHandler: { (response) in
if response.result.isFailure{
completion(nil)
self.delegate?.metaError()
return
}else{
do {
let decoder = JSONDecoder()
let root = try decoder.decode(Root.self, from: response.data!)
SharedUsers.sharedUser.populateData(sender: root.data)
print(SharedUsers.sharedUser.users[0].id)
self.delegate?.updated()
completion("Fetched")
self.delegate?.updated()
} catch {
print("error: ", error)
completion(nil)
self.delegate?.metaError()
}
}
})
}
else{
print("Error")
}
}
:
func like_all(completion: @escaping() ->()){
let group2 = DispatchGroup()
group2.enter()
for user in SharedUsers.sharedUser.users{
if let id = user.id{
let group = DispatchGroup()
group.enter()
let when = DispatchTime.now() + 0.5 // change 2 to desired number of seconds
DispatchQueue.main.asyncAfter(deadline: when) {
Network.sharedInstance.like(sender_id: id) { result in
group.leave()
print(result)
}
}
}
else{
continue
}
}
group2.leave()
completion()
}
편집 : 나는 기능을 편집하지만 여전히 첫 번째 요청이라고 모든 req를 기다리지 않고 유익하다.
https://stackoverflow.com/questions/11909629/waiting-until-two-async-blocks-are-executed-before-starting-another-block –
모든 첫 요청을 비동기로 보내면 첫 번째 req는 두 번째 req라고 부릅니다. 이 접근 방식이 효과가 있습니까? –
신속한 3에서 DispatchGroup을 사용하여 GCD를 사용하여이 작업을 수행 할 수 있습니다. 모든 작업이 완료되면 알림을받을 수 있습니다. –