gpt4 book ai didi

swift - 如何用异步任务装饰 Siesta 请求

转载 作者:行者123 更新时间:2023-11-28 05:57:27 26 4
gpt4 key购买 nike

在请求发生之前更改执行异步任务的请求的正确方法是什么?

因此任何请求 Rn 都需要透明地变成 Tn 然后是 Rn。

这里有一些背景知识:任务是一个第 3 方 SDK,它发送一个 token ,我需要将其用作原始请求的 header 。

我的想法是装饰 Rn,但在这样做时我需要将我的 Tn 任务转换为 Siesta Request 然后我可以链接。

所以我包装了异步任务并链接到我的原始请求。因此任何 Rn 都会变成 Tn.chained { .passTo(Rn) }这样,这个新行为对整个应用程序来说是完全透明的。

问题

这样做我的代码最终会在 Siesta 内部前提条件下崩溃:precondition(completedValue == nil, "notifyOfCompletion() 已经调用")

在我的自定义 AsyncTaskRequest 中,我收集成功、失败、进度等的回调,以便在 SDK 交付 token 时在主队列上触发它们。

我注意到在执行后删除所有存储的回调,崩溃消失,但老实说我没有找到原因。

我希望有足够的信息来提供一些提示或建议。提前谢谢你。

最佳答案

是的,实现 Siesta 的 Request 接口(interface)绝非易事。其他人有exactly the same problem — 幸运的是 Siesta 版本 1.4 includes a solution .

新功能的文档仍然很薄。要使用新的 API,您需要实现新的 RequestDelegate 协议(protocol),并将您的实现传递给 Resource.prepareRequest(using:)。这将返回一个请求,您可以在标准 Siesta 请求链中使用该请求。结果看起来像这样(警告——未经测试的代码):

struct MyTokenHandlerThingy: RequestDelegate {
// 3rd party SDK glue goes here
}

...

service.configure(…) {
if let authToken = self.authToken {
$0.headers["X-Auth-Token"] = authToken // authToken is an instance var or something
}

$0.decorateRequests {
self.refreshTokenOnAuthFailure(request: $1)
}
}

func refreshTokenOnAuthFailure(request: Request) -> Request {
return request.chained {
guard case .failure(let error) = $0.response, // Did request fail…
error.httpStatusCode == 401 else { // …because of expired token?
return .useThisResponse // If not, use the response we got.
}

return .passTo(
self.refreshAuthToken().chained { // If so, first request a new token, then:
if case .failure = $0.response { // If token request failed…
return .useThisResponse // …report that error.
} else {
return .passTo(request.repeated()) // We have a new token! Repeat the original request.
}
}
)
}
}

func refreshAuthToken() -> Request {
return Request.prepareRequest(using: MyTokenHandlerThingy())
.onSuccess {
self.authToken = $0.jsonDict["token"] as? String // Store the new token, then…
self.invalidateConfiguration() // …make future requests use it
}
}
}

要了解如何实现RequestDelegate,目前最好的办法是查看 new API docs directly in the code .

由于这是一项尚未发布的全新功能,非常感谢您报告它如何为您工作以及您遇到的任何问题。

关于swift - 如何用异步任务装饰 Siesta 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51029172/

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