我目前正在使用Alamofire,它包含了组合支持,并使用它的方式如下:
let request = AF.request(endpoint)
...
request
.publishDecodable(type: T.self, decoder: decoder)
.value()
.eraseToAnyPublisher()这将发布结果和AFError,但是在订阅者的.sink中,我找不到获取HTTP代码的任何地方。在订阅服务器中获取状态代码的最佳方法是什么?
发布于 2020-12-04 02:38:01
如果需要响应代码,请不要使用DataPublisher擦除.value()。相反,使用从各种DataResponse方法获得的publish,这些方法包含所有不同的响应信息,包括状态代码。然后,您可以将其.map到您需要的任何类型。
发布于 2021-03-09 01:33:39
For Swift 5.X和Xcode 12.4用于调试,您可以在组合发布服务器(publishDecodable())之前截获响应,并获得其中一些元素,如下所示:
session.request(signedRequest)
.responseJSON { response in
print(response.request) // original URL request
print(response.response) // URL response
print(response.data) // server data
print(response.result) // result of response serialization
}发布于 2021-12-09 13:02:44
简单的MVVM方式:
func fetchChats() -> AnyPublisher<ChatListModel, AFError> {
let url = URL(string: "Your_URL")!
AF.request(url, method: .get)
.validate()
.publishDecodable(type: ChatListModel.self)
.value()
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}稍后在viewModel中
private var subscriptions: Set<AnyCancellable> = []
// some func
dataManager.fetchChats()
.sink {[weak self] completion in
guard let self = self else { return }
switch completion {
case .failure(let error):
switch error.responseCode {
case 401:
//do something with code
default:
print(error.responseCode)
}
print("All errors:\(error)")
case .finished:
break
}
} receiveValue: {[weak self] message in
guard let self = self else { return }
self.message = message
}
.store(in: &subscriptions)https://stackoverflow.com/questions/65132939
复制相似问题