我使用DispatchGroup等待某个函数的回调执行后再继续。在这个功能范围内,我打电话给阿拉莫消防队请求。我的问题发生在我引入DispatchGroup时,AlamoFire的关闭从未执行过。
样品
let group = DispatchGroup()
group.enter()
Networking.getInfo(userID: userID) { info in
group.leave()
}
group.wait()
Networking
类:
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响应正在组挂起的同一队列(main(上排队(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()
然后效果很好。