gpt4 book ai didi

swift - DispatchGroup().wait() 之后的代码从未调用

转载 作者:行者123 更新时间:2023-11-30 11:11:23 25 4
gpt4 key购买 nike

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

这是代码:

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,您将能够以与上面尝试的相同方式访问该对象。

如果您不想添加依赖项,则可以使用如下的完成处理程序在请求结束时获取对象。

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)
}

关于swift - DispatchGroup().wait() 之后的代码从未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52149718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com