依次调用两个Alamofire函数
Posted
技术标签:
【中文标题】依次调用两个Alamofire函数【英文标题】:Call two Alamofire Function one after another 【发布时间】:2017-12-08 10:20:56 【问题描述】:我有一个用户类,其中有一个 ID 属性。我做了一个满足此类(ID 值)的 Alamofire 请求。当一个按钮被点击时,我执行另一个发送用户 ID 的 Alamofire 请求。我在第一个请求中有 7 个用户,所以第二个请求完成了 7 次。当点击按钮时,我希望该过程连续进行,以便当我点击按钮时它应该执行第一个请求 -> 第二个请求(7 次) -> 第一个请求 -> 第二个请求(7 次).....问题是它需要等待第一个请求完成以及所有第二个请求。这样做时最好的方法是什么?我正在考虑创建组,但我不确定。
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 :(")
)
第一个请求:
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()
编辑:我编辑了函数,但仍然调用了第一个请求,而无需等待所有类似的请求。
【问题讨论】:
***.com/questions/11909629/… 如果您异步发送所有第一个请求,然后在每个第一个请求完成后您将其称为第二个请求,会发生什么?这种方法对你有用吗? 您可以使用 GCD 在 swift 3 中使用 DispatchGroup 来实现此目的。当所有任务完成时,您会收到通知。 @InderKumarRathore 我虽然也这样,但认为在第 3、第 4 期。喜欢的电话可以在分配新课程之前以一种或另一种方式调用。它应该等待。 【参考方案1】:有不同的方法,一种是 DispatchGroup
let group = DispatchGroup()
group.enter()
func like(sender_id: String, completion: @escaping () -> ())
group.leave()
group.enter()
func get_rec(completion: @escaping (String?) -> ())
group.leave()
group.notify(queue: .main)
print("both requests done")
另一个是 NSOperationQueue by addDependency 。
【讨论】:
我可以为这些群组添加一些延迟吗?例如,我想在 get_rec 完成后等待 3 秒? 无需延迟。 func 像完成块添加 group.leave()。之后 get_rec 开始运行 当我只调用该组一次但我将它放在一个 While(true) 中时它正在工作,以便我可以按顺序调用它。但是当我这样做时,它不起作用。以上是关于依次调用两个Alamofire函数的主要内容,如果未能解决你的问题,请参考以下文章
Alamofire:无法调用非函数类型“NSHTTPURLResponse”的值?
包装在静态函数中时,Alamofire 4.0“调用中的额外参数'方法'”