首页 > 解决方案 > 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 处理这种情况?

标签: iosswiftxcodecombine

解决方案


这可以通过以下方式完成:

        .handleEvents(receiveOutput: {
            self.save($0.accessToken)
        })

推荐阅读