调度组不允许执行 Alamofire 请求
Dispatch Group not allowing Alamofire request to execute
我正在使用 DispatchGroup 等待我的一个函数的回调执行,然后再继续。在该函数中,我调用 Alamo fire get 请求。我的问题出现在我引入 DispatchGroup 时,AlamoFire 闭包永远不会执行。
样本
let group = DispatchGroup()
group.enter()
Networking.getInfo(userID: userID) { info in
group.leave()
}
group.wait()
Networking
class:
static func getInfo(userID: Int, completion: @escaping(_ info: String) -> Void) {
// Program reaches here
Alamofire.request("https://someurl.com").responseJSON { response in
// Program does NOT get here
if let json = response.result.value {
completion("Successful request")
} else {
completion("Some Error")
}
}
}
当我不使用 DispatchGroup 时,它工作正常。当我确实使用 DispatchGroup 时,getInfo
函数启动,但永远不会执行 Alamofire 请求的关闭。
不确定我是对的,但我怀疑 Alamofire 响应正在队列中排队(主队列),该队列已暂停(wait())。因为队列被挂起,完成闭包永远不会执行。
像这样手动编写异步代码可能非常棘手。我的建议是使用任何一个可以帮助解决这个问题的异步库。我个人最喜欢的是 PromiseKit,它也有支持 Alamofire 的特定扩展。像这样的项目可以消除异步代码带来的很多麻烦。他们可能需要一些时间让您了解他们的范例,但这是值得的。
我遇到了同样的问题。在那种情况下,我使用 URLSession 请求来摆脱它。这 API 使您的应用能够在您的应用未 运行 或 iOS 处于暂停状态时执行后台下载。
https://developer.apple.com/documentation/foundation/urlsession
let request = try URLRequest(url: url, method: .get, headers: headers)
Alamofire.request(request) { response in
...
...
}
我改成这样:-
let request = try URLRequest(url: url, method: .get, headers: headers)
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
...
...
}
task.resume()
然后它运行良好。
我正在使用 DispatchGroup 等待我的一个函数的回调执行,然后再继续。在该函数中,我调用 Alamo fire get 请求。我的问题出现在我引入 DispatchGroup 时,AlamoFire 闭包永远不会执行。
样本
let group = DispatchGroup()
group.enter()
Networking.getInfo(userID: userID) { info in
group.leave()
}
group.wait()
Networking
class:
static func getInfo(userID: Int, completion: @escaping(_ info: String) -> Void) {
// Program reaches here
Alamofire.request("https://someurl.com").responseJSON { response in
// Program does NOT get here
if let json = response.result.value {
completion("Successful request")
} else {
completion("Some Error")
}
}
}
当我不使用 DispatchGroup 时,它工作正常。当我确实使用 DispatchGroup 时,getInfo
函数启动,但永远不会执行 Alamofire 请求的关闭。
不确定我是对的,但我怀疑 Alamofire 响应正在队列中排队(主队列),该队列已暂停(wait())。因为队列被挂起,完成闭包永远不会执行。
像这样手动编写异步代码可能非常棘手。我的建议是使用任何一个可以帮助解决这个问题的异步库。我个人最喜欢的是 PromiseKit,它也有支持 Alamofire 的特定扩展。像这样的项目可以消除异步代码带来的很多麻烦。他们可能需要一些时间让您了解他们的范例,但这是值得的。
我遇到了同样的问题。在那种情况下,我使用 URLSession 请求来摆脱它。这 API 使您的应用能够在您的应用未 运行 或 iOS 处于暂停状态时执行后台下载。 https://developer.apple.com/documentation/foundation/urlsession
let request = try URLRequest(url: url, method: .get, headers: headers)
Alamofire.request(request) { response in
...
...
}
我改成这样:-
let request = try URLRequest(url: url, method: .get, headers: headers)
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
...
...
}
task.resume()
然后它运行良好。