Swift Combine: как обработать событие и продолжить поток - PullRequest
0 голосов
/ 10 апреля 2020

Я реализую библиотеку с функцией входа в систему с помощью Swift Combine.

С помощью следующего кода я уже могу войти в систему, сериализовать ответ на объект AuthenticationResult и вернуть издателя с пользователем или ApiError в результате.

В рамках ответа (объект AuthenticationResult) я также получаю accessToken из API. Я хотел бы сохранить этот токен локально как часть этого потока. Но я бы хотел, чтобы это делалось внутри библиотеки, чтобы ответ от функции входа в систему не менялся.

Есть ли способ обработки ситуаций такого типа в потоке, чтобы обработать событие, но затем продолжить с потоком, чтобы вернуть пользователя?

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?

1 Ответ

0 голосов
/ 11 апреля 2020

Это можно сделать с помощью:

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