IDプロパティを持つUserクラスがあります。私はこのクラス(ID値)を満たすAlamofireリクエストを行います。ボタンをタップすると、ユーザーIDを送信する別のAlamofireリクエストを行います。最初のリクエストで7人のユーザーを取得していますので、2番目のリクエストは7回完了しました。ボタンをタップすると、私はそのプロセスを継続したいので、ボタンをタップすると最初のリクエスト - > 2回目のリクエスト(7回) - >最初のreq - > 2回目のreq(7回).....問題がある最初の要求が完了するのを待つ。これを行う最善の方法は何でしょうか?私はグループを作ることを考えているが、わからない。2つのAlamofire関数を1つずつ呼び出します。
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()
}
}}
2番目のリクエスト:
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はそれを2番目のreqと呼びますか?このアプローチはあなたのために働くでしょうか? –
これを実現するには、GCDを使用してDispatchGroupをswift 3で実行します。すべてのタスクが終了したら通知を受け取ることができます。 –