我正在使用DispatchGroup等待直到执行我的功能之一的回调后再继续。在该函数中,我正在调用Alamo fire get请求。当我引入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请求的关闭从未执行。
答案 0 :(得分:0)
不确定我是对的,但我怀疑Alamofire响应正在该组已暂停的同一队列(主队列)中排队(wait())。因为队列被挂起,所以完成关闭永远不会执行。
像这样手动编写异步代码可能非常棘手。我的建议是使用那里的任何一个异步库都可以帮上忙。我个人最喜欢的是PromiseKit,它还具有特定的扩展名以支持Alamofire。像这样的项目可能会使异步代码不堪重负。他们可能需要一些时间来了解自己的范例,但这是值得做的。
答案 1 :(得分:0)
我遇到了同样的问题。在那种情况下,我使用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()
然后工作正常。