首页 > 解决方案 > DispatchGroup().wait() 之后的代码从未调用过

问题描述

我想让我的服务调用同步,因为我希望我的调用返回我已经用泛型映射的对象。

这是代码:

func execute<T: Mappable>(request: HttpRequest, responseType: T.Type) throws -> T? {
    var responseObject: T?
    let group = DispatchGroup()
    group.enter()

    Alamofire.SessionManager.default.request(request.stringURL, method: request.method, parameters: request.parameter.toJSON(), encoding: request.encoding, headers: request.headers)
        .validate()
        .response(completionHandler: { response in
            responseObject = self.singleResult(dataResult: response.data, resultType: T.self)
            group.leave()
    })

    group.wait()

    guard let response = responseObject else {
        return nil
    }

    return response
}

问题是 group.wait() 下的代码永远不会被调用,但是对于 Charles,我可以看到请求正在工作并且已经结束。

标签: swiftalamofire

解决方案


我会推荐PromiseKit让你对处理异步代码有更多的控制。使用PromiseKit,您将能够以与上面尝试相同的方式访问该对象。

如果您不想添加依赖项,则可以completion handler在请求结束时使用以下方法获取对象。

func execute<T: Mappable>(request: HttpRequest, responseType: T.Type, completion: @escaping ((T?) -> Void)) {
        Alamofire.SessionManager.default.request(request.stringURL, method: request.method, parameters: request.parameter.toJSON(), encoding: request.encoding, headers: request.headers)
            .validate()
            .response(completionHandler: { response in
                let mappedObject: T? = self.singleResult(dataResult: response.data, resultType: T.self)
                completion(mappedObject)
            })
} 

然后你可以调用如下方法,

let service = YourService()
service.execute(request: fetchUser, responseType: User.self) { user in
            guard let user = user else { return }
            print(user.name)
        }

推荐阅读