swift - 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,我可以看到请求正在工作并且已经结束。
解决方案
我会推荐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)
}
推荐阅读
- r - 自动创建数据子集
- python-3.x - 为什么首先测试一个类方法会导致其他应该引发错误的单元测试失败?
- firebase - 错误:找不到正确的提供者
- > 在此规划器小部件上方
- jquery - Django jquery ajax 评论回复创建多个值
- c++ - 如何从 QUdpSocket 检测“端口不可达”情况?
- python - 二维矩阵 PYTHON 中的最大和矩形
- sql-server - SAS proc sql passthrough无限期运行
- javascript - 无法使用 JQuery 将值传入或传出 Python
- list - clgo 中的谜语谜题
- python - Patsy Dmatrices X, y 分裂