在单个发布者链中执行多个 URLSessionDataTask
Perform multiple URLSessionDataTask in a single publisher chain
我很确定这应该是可能的,我只是在搜索错误的东西,但我要做的是在同一个发布者链中执行 2 个网络请求。
基本上我正在尝试获取 JSON Web 令牌(从网络或本地),然后使用该 JWT 执行请求的获取。
我创建了一个自定义订阅和发布者来获取我的 JWT,它在本地存储令牌并检查它是否有效,以便它可以被重用、更新或首次请求。但是,我无法弄清楚如何将其与提取一起使用。
这是我所在的位置(请暂时忽略强制解包):
JWTState.publisher(JWTState.urlRequest!)
.tryMap { (jwtState) -> String in
guard jwtState.isValid == true else {
throw JWTError.invalidJWT
}
return jwtState.jwt
}
.map { (jwt) -> URLRequest in
URLRequest.jsonRequest(url: url, jwt: jwt)
}
那时我有一个有效的 URLRequst
用于使用有效的 JWT 进行提取,但我不知道如何调用下一个 URLSession.shared.dataTaskPublisher
或 URLSession.shared.dataTask
链条。
我希望我错过了一些发布者或函数,或者有人可以引导我朝着正确的方向前进。我还猜测我可能必须创建另一个自定义订阅和发布者对,但目前我看不出这样做会有什么帮助。
提前致谢。
这就是 flatMap
的用途。 flatMap
作用于每个值,但不是将其映射到另一个值,而是将其映射到发布者,在您的情况下,这将是第二个 url 请求。
大意是:
let jwtRequest = URLRequest(...)
let fetchDataPublisher = URLSession.shared
.dataTaskPublisher(for: jwtRequest)
.map(\.data)
.decode(type: Token.self, decoder: JSONDecoder()) // get the token
.flatMap { token -> AnyPublisher<Data, Error> in
let apiRequest = URLRequest(...) // with token
return URLSession.shared
.dataTaskPublisher(for: apiRequest)
.map(\.data)
.mapError { [=10=] as Error }
.eraseToAnyPublisher()
}
.decode(type: Something.self, decoder: JSONDecoder())
这是一个简化的示例,因为我没有处理错误并且对您提取令牌的方式采取了随意的态度。
我很确定这应该是可能的,我只是在搜索错误的东西,但我要做的是在同一个发布者链中执行 2 个网络请求。
基本上我正在尝试获取 JSON Web 令牌(从网络或本地),然后使用该 JWT 执行请求的获取。
我创建了一个自定义订阅和发布者来获取我的 JWT,它在本地存储令牌并检查它是否有效,以便它可以被重用、更新或首次请求。但是,我无法弄清楚如何将其与提取一起使用。
这是我所在的位置(请暂时忽略强制解包):
JWTState.publisher(JWTState.urlRequest!)
.tryMap { (jwtState) -> String in
guard jwtState.isValid == true else {
throw JWTError.invalidJWT
}
return jwtState.jwt
}
.map { (jwt) -> URLRequest in
URLRequest.jsonRequest(url: url, jwt: jwt)
}
那时我有一个有效的 URLRequst
用于使用有效的 JWT 进行提取,但我不知道如何调用下一个 URLSession.shared.dataTaskPublisher
或 URLSession.shared.dataTask
链条。
我希望我错过了一些发布者或函数,或者有人可以引导我朝着正确的方向前进。我还猜测我可能必须创建另一个自定义订阅和发布者对,但目前我看不出这样做会有什么帮助。
提前致谢。
这就是 flatMap
的用途。 flatMap
作用于每个值,但不是将其映射到另一个值,而是将其映射到发布者,在您的情况下,这将是第二个 url 请求。
大意是:
let jwtRequest = URLRequest(...)
let fetchDataPublisher = URLSession.shared
.dataTaskPublisher(for: jwtRequest)
.map(\.data)
.decode(type: Token.self, decoder: JSONDecoder()) // get the token
.flatMap { token -> AnyPublisher<Data, Error> in
let apiRequest = URLRequest(...) // with token
return URLSession.shared
.dataTaskPublisher(for: apiRequest)
.map(\.data)
.mapError { [=10=] as Error }
.eraseToAnyPublisher()
}
.decode(type: Something.self, decoder: JSONDecoder())
这是一个简化的示例,因为我没有处理错误并且对您提取令牌的方式采取了随意的态度。