我想使对服务的调用同步,因为我想让调用返回已经映射了泛型的对象。
代码如下:
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我可以看到请求正在运行并且已经结束。
答案 0 :(得分:0)
我建议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)
}