【发布时间】:2018-05-22 22:19:19
【问题描述】:
我需要等到 Alamofire 请求完成获取数据。 (错误或值)。我在另一个函数的 for 循环中调用 Alamofire 函数,以便在调用第二个 for 循环之前完成 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调用,避免任何执行路径的风险你没有打电话给leave。坦率地说,这没有实际意义,因为您根本不应该使用调度组,而只是仅供参考。 -
我查看了 promisekit,但我不确定它是否适合我的问题。
-
下面我概述了如何做到这一点的两种替代方法,但 PromiseKit 绝对是解决这个问题的另一种方法。关键思想是,在启动另一个异步进程之前,您永远不想
wait,而是使用其中一种模式在前一个请求完成时异步触发一个请求。这样可以避免阻塞线程(并消除任何死锁风险)。
标签: ios swift loops alamofire dispatch