ios - Swift Combine:如何处理事件并继续流
问题描述
我正在使用 Swift Combine 实现一个带有登录功能的库。
使用以下代码,我已经能够登录,序列化对对象 AuthenticationResult 的响应,并返回带有 User 或 ApiError 作为结果的 Publisher。
作为响应(AuthenticationResult 对象)的一部分,我还从 API 获取 accessToken。我想将该令牌作为此流的一部分在本地保存。但我希望在库内部完成,以便登录功能的响应不会改变。
有没有办法在流中处理这种类型的情况,处理事件,然后继续流返回用户?
func authenticate(username: String, password: String) -> AnyPublisher<User, ApiError> {
let parameters: [String: Any] = [
"username": username,
"pw": password
]
var request = URLRequest(endpoint: Endpoint.login)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: [])
return URLSession.shared.dataTaskPublisher(for: request)
.map { $0.data }
.decode(type: AuthenticationResult.self, decoder: JSONDecoder())
.map { $0.user }
// Here I would like to do something like: .handleAndContinue { self.save($0.accessToken }
.mapError { _ in ApiError.loginError }
.receive(on: RunLoop.main)
.eraseToAnyPublisher()
}
或者有没有其他方法可以使用 Swift Combine 处理这种情况?
解决方案
这可以通过以下方式完成:
.handleEvents(receiveOutput: {
self.save($0.accessToken)
})
推荐阅读
- python - python3中是否有等效的“man”命令来查看方法的使用?
- python - Python - @classmethod 表现得像 @property
- asp.net-core - What has replaced RequestResourceOwnerPasswordAsync in IdentityModel v.4.3.0?
- android - 在 Android Studio 中计算我的 xml 布局复杂度?
- r - 删除R中具有特定数字的行
- ruby-on-rails - 如何在 Rails 中安全地存储 ruby 哈希?
- hook - React - 显示图像而不是字符串
- r - 多行的闪亮和 ggplot2
- reactjs - 在列表中使用 react redux 钩子会影响性能吗?
- r - 从我自己调用一个注册的 knitr 引擎