使用 Combine 当服务器没有返回数据时处理成功响应
Handle success response when there is no Data returned by the server with Combine
我正在尝试使用 Combine Framework 实现网络连接,我可以使用以下代码从服务器获取数据,但是当服务器没有返回数据但请求成功时我遇到了一个问题。
return URLSession.shared.dataTaskPublisher(for: request)
.tryMap { response in
print(response)
guard let httpURLResponse = response.response as? HTTPURLResponse, 200..<299 ~= httpURLResponse.statusCode else {
throw CustomError.serverError
}
if response.data.isEmpty && 200..<299 ~= httpURLResponse.statusCode {
//HOW TO HANDLE IF if there is no Data from server but request has been processed successfully
}
return response.data
}
.decode(type: R.self, decoder: decoder)
.mapError{CustomError.map(error: [=10=])}
.receive(on: RunLoop.main)
.eraseToAnyPublisher()
}
能否请您指导我如何处理服务器没有返回数据时的成功响应。
如果我需要详细说明我的问题,请告诉我。
根据您的评论,由于您需要 return 类型 R
的值或“某物”以防成功但为空的数据响应,那么您可以构建一个 returns 一个可选的 R?
.
您需要使用 flatMap
来处理这个分支:
return URLSession.shared.dataTaskPublisher(for: request)
.tryMap { response -> Data in
guard let httpURLResponse = response.response as? HTTPURLResponse,
200..<299 ~= httpURLResponse.statusCode {
throw CustomError.serverError
}
return response.data
}
.flatMap { data -> AnyPublisher<R?, Error> in
if data.isEmpty {
return Just(nil).setFailureType(to: Error.self).eraseToAnyPublisher()
}
return Just(data).decode(type: R?.self, decoder: decoder)
.eraseToAnyPublisher()
}
.mapError {
[=10=] as? CustomError ?? CustomError.map(error: [=10=])
}
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
上面的管道将return一个R?
值,当数据为空时nil
。
我正在尝试使用 Combine Framework 实现网络连接,我可以使用以下代码从服务器获取数据,但是当服务器没有返回数据但请求成功时我遇到了一个问题。
return URLSession.shared.dataTaskPublisher(for: request)
.tryMap { response in
print(response)
guard let httpURLResponse = response.response as? HTTPURLResponse, 200..<299 ~= httpURLResponse.statusCode else {
throw CustomError.serverError
}
if response.data.isEmpty && 200..<299 ~= httpURLResponse.statusCode {
//HOW TO HANDLE IF if there is no Data from server but request has been processed successfully
}
return response.data
}
.decode(type: R.self, decoder: decoder)
.mapError{CustomError.map(error: [=10=])}
.receive(on: RunLoop.main)
.eraseToAnyPublisher()
}
能否请您指导我如何处理服务器没有返回数据时的成功响应。
如果我需要详细说明我的问题,请告诉我。
根据您的评论,由于您需要 return 类型 R
的值或“某物”以防成功但为空的数据响应,那么您可以构建一个 returns 一个可选的 R?
.
您需要使用 flatMap
来处理这个分支:
return URLSession.shared.dataTaskPublisher(for: request)
.tryMap { response -> Data in
guard let httpURLResponse = response.response as? HTTPURLResponse,
200..<299 ~= httpURLResponse.statusCode {
throw CustomError.serverError
}
return response.data
}
.flatMap { data -> AnyPublisher<R?, Error> in
if data.isEmpty {
return Just(nil).setFailureType(to: Error.self).eraseToAnyPublisher()
}
return Just(data).decode(type: R?.self, decoder: decoder)
.eraseToAnyPublisher()
}
.mapError {
[=10=] as? CustomError ?? CustomError.map(error: [=10=])
}
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
上面的管道将return一个R?
值,当数据为空时nil
。