Я реализую библиотеку с функцией входа в систему с помощью 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?