【发布时间】:2020-11-03 11:15:20
【问题描述】:
我真的是Combine 的新手,我一直被这个问题困扰。我有基本的注册表单,如果一切正常,返回空响应,返回 200 代码;如果表单有一些注册失败,返回 442。
这是可以处理空响应并且工作正常的代码
extension Route where ResultType: EmptyResult {
func emptyResult() -> AnyPublisher<Void, APIError> {
return URLSession.shared.dataTaskPublisher(for: urlRequest)
.print("EMPTY RESULT")
.tryMap { data, response in
guard let httpResponse = response as? HTTPURLResponse else { throw APIError.nonHttpResponse(description: "Not http resp") }
let statusCode = httpResponse.statusCode
guard (200..<300).contains(statusCode) else { throw APIError.nonHttpResponse(description: "bad response")
}
return Void()
}.mapError { error in
print("Error \(error)")
return .network(description: error.localizedDescription)
}
.eraseToAnyPublisher()
}
}
但是,我如何返回其他类型的发布者?例如
struct CustomError: Decodable {
let usernameError: String
let emailError: String
}
我的网络通话:
API.registration(name: name, email: email, password: password, schoolID: selectedSchool?.id ?? 0)
.print("Registration")
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: { (completion) in
switch completion {
case let .failure(error):
print("ERROR \(error)")
case .finished: break
}
}, receiveValue: { value in
print(value)
})
.store(in: &disposables)
【问题讨论】:
-
那么您的网络请求是否总是返回
CustomError作为响应? -
并非总是如此,仅当存在表单验证问题时。如果没有表单验证问题,我会得到 200 个代码的空响应
标签: swift networking combine