调度组不允许Alamofire请求执行

时间:2018-07-19 02:18:13

标签: ios swift alamofire grand-central-dispatch

我正在使用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请求的关闭从未执行。

2 个答案:

答案 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()

然后工作正常。