调度组不允许执行 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()

然后它运行良好。