【发布时间】:2021-11-27 06:05:20
【问题描述】:
嘿,我有一个带有 viewModel 的 SwiftUI。当用户点击登录按钮时,我运行viewModel.registerAccount 函数。
func registerAccount() {
authService.registerAccount(params: params)
.sink { (dataResponse) in
if let error = dataResponse.error {
//
} else {
//
}
}.store(in: &cancellableSet)
}
在这个函数中,我调用了我的AuthService,我想在其中保存一些值并更改响应。
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
}
}
还有APIClient 定义。
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()
}
}
但这并不能解决我的需求。我想知道是否有办法读取AuthService 中的响应,并返回Error? 类型的响应。
在某一时刻,我想到了这一点,也列在 AuthService 中,但我想更改响应并仅发送格式为 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
}
我也想过这个,但我正在寻找一种更结合/SwiftUI 的方法。
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)
}
【问题讨论】:
-
只需要返回`AnyPublisher
`吗?
标签: ios swift alamofire combine