【问题标题】:Dispatch Group not allowing Alamofire request to execute调度组不允许执行 Alamofire 请求
【发布时间】:2018-07-19 02:18:13
【问题描述】:

我正在使用 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 请求的关闭永远不会执行。

【问题讨论】:

  • 试图将异步操作转换为同步操作是错误的方法。
  • 调度组不是等待操作完成的选择。您可能需要 Semaphore 。但是这样你可能会陷入僵局

标签: ios swift alamofire grand-central-dispatch


【解决方案1】:

不确定我是对的,但我怀疑 Alamofire 响应正在排队在该组已暂停 (wait()) 的同一队列 (main) 上。因为队列被挂起,完成闭包永远不会执行。

像这样手动编写异步代码可能非常棘手。我的建议是使用任何一个可以帮助解决此问题的异步库。我个人最喜欢的是PromiseKit,它还具有支持 Alamofire 的特定扩展。像这样的项目可以从异步代码中解决很多问题。他们可能需要一些时间来了解他们的范式,但这是值得的。

【讨论】:

  • 我认为您可能是正确的。我使用闭包中的依赖代码将group.wait() 切换到group.notify(queue: .main){.....},它似乎可以工作。
【解决方案2】:

我遇到了同样的问题。在那种情况下,我使用 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()

然后它运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-07
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 2013-11-22
    • 2017-08-28
    • 1970-01-01
    相关资源
    最近更新 更多