【发布时间】:2021-10-06 20:39:09
【问题描述】:
我想创建一个模块,如果需要,它将刷新令牌并使用 Apple 的 Combine 重复最新请求。
目前,每个部分都运行良好,但不是这个:
public func executeRequest<T: Decodable, E: ServerErrorType>(
_ request: HTTPRequest,
mapper: ObjectMapper<T, E>
) -> AnyPublisher<(T, HTTPResponse), Error> {
return authentificator // <- handle refresh token stuff
.refreshToken(force: false)
.subscribe(on: DispatchQueue.global())
.flatMap { token in // <- on obtain token - transform it into request
---> (here)
session.publisher(for: request, mapper: mapper, token: token) // <- create request
---> (here)
.tryCatch({ error -> AnyPublisher<(T, HTTPResponse), Error> in
if let error = error as? ServerErrorType,
error.isAuthError {
return authentificator
.refreshToken(force: true)
.subscribe(on: DispatchQueue.global())
.flatMap { token -> AnyPublisher<(T, HTTPResponse), Error> in
session.publisher(for: request, mapper: mapper, token: token) //<- repeat if token refreshed
}
.eraseToAnyPublisher()
} else {
throw error
}
})
.print()
}
.receive(on: DispatchQueue.main)
.print()
.eraseToAnyPublisher()
}
在令牌过期时标记(here) 的地方,tryCatch 不起作用,而是在控制台中打印“收到已取消”。我不确定我做错了什么。可以给点意见吗?
【问题讨论】:
-
您如何订阅
executeRequest?你在存储AnyCancellable吗?另外,可能不相关,但是您需要.subscribe(on: DispatchQueue.global())有什么原因吗? -
@NewDev,是的,我在 sink 之后存储可取消的,是的 - subscribe(on:) 可以省略
标签: ios swift combine urlsession