Hei, I have a SwiftUI with its viewModel. When the user taps on the Login button I run the viewModel.registerAccount
function.
func registerAccount() {
authService.registerAccount(params: params)
.sink { (dataResponse) in
if let error = dataResponse.error {
//
} else {
//
}
}.store(in: &cancellableSet)
}
In this function I make a call to my AuthService
where I want to save some values and change the response.
class AuthService {
private let apiClient: APIClient = APIClient()
private var guid: String?
func registerAccount(params: [String: Any]) -> AnyPublisher<DataResponse<RegisterAccountResponse, Error>, Never> {
let registerRequest = RegisterAccountRequest(params: params) // (url + method + params + ...)
let apiRequest = apiClient.request(request: registerRequest)
// i would like to read response, save guid
// change response type and return only Error?
return apiRequest
}
}
Also the APIClient
definition.
class APIClient {
private let session: Session = Session(configuration: URLSessionConfiguration.default)
func request<T: APIRequest>(request: T) -> AnyPublisher<DataResponse<T.Response, Error>, Never> {
request
.dataRequest(session: session)
.publishDecodable(type: T.Response.self)
.map { response in
response.mapError { error in
return error
}
}
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}
}
But this doesn't solve my needs. What would I like is to know if there is a way to read the response in AuthService
, and return a response of type Error?
.
At one point I had this in mind, to listed also in AuthService
but I want to change the response and send only an object of format Error?
.
func registerAccount(params: [String: Any]) ->
AnyPublisher<DataResponse<RegisterAccountResponse, Error>, Never> {
let registerRequest = RegisterAccountRequest(params: params)
let apiRequest = apiClient.request(request: registerRequest)
apiRequest.sink { dataResponse in
if let guid = dataResponse.value?.guidFlow {
self.guid = guid
}
}.store(in: &cancellableSet)
return apiRequest
}
I also thought at this, but I was looking for a more Combine/SwiftUI approach.
func registerAccount(params: [String: Any], completion: @escaping (Error?) -> Void) {
let registerRequest = RegisterAccountRequest(params: params)
let apiRequest = apiClient.request(request: registerRequest)
apiRequest.sink { dataResponse in
if let value = dataResponse.value {
// save guid and return nill or backend error (format Error)
} else {
completion(dataResponse.error)
}
}.store(in: &cancellableSet)
}