我正在学习使用 RxSwift,但我一直在使用这个简单的代码。我的目的是采用 APIRequest 类型,就像这样简单:
public protocol APIRequest: Encodable {
associatedtype Response: Decodable
var path: String { get }
}
将其传递给 API 客户端并最终返回 T.Response
类型的 Observable,但是,我不断在控制台中看到 cancelled
状态:
2019-07-01 10:46:04.847: test api request -> subscribed
2019-07-01 10:46:04.855: test api request -> isDisposed
这是我的 APIClient 的代码:
func send<T: APIRequest>(_ request: T) -> Observable<T.Response> {
guard let fullURL = endpoint(for: request) else {
return Observable.error(APIError.invalidBaseURL)
}
return Observable<T.Response>.create { observer in
let request = URLRequest(url: fullURL)
let response = URLSession.shared.rx.response(request: request)
.debug("test api request")
return response.subscribe(onNext: { response, data in
if 200..<300 ~= response.statusCode {
guard let responseItems = try? self.jsonDecoder.decode(T.Response.self, from: data) else {
return observer.onError(APIError.decodingFailed)
}
observer.onNext(responseItems)
observer.onCompleted()
}
}, onError: { error in
observer.onError(APIError.other(error))
}, onCompleted: nil,
onDisposed: nil)
}
}
我一直在尝试将结果打印到控制台:
apiClient.send(countriesRequest)
.subscribe(onNext: {
print("Success", $0)
}, onError: {
print("Error: ", $0)
}, onCompleted: {
print("Completed!")
})
.disposed(by: disposeBag)
我做错了什么,为什么?
最佳答案
我尝试重新创建您的代码,它在我的设备上似乎运行良好:
func send<T>(_ request: T) -> Observable<Data> {
let request = URLRequest(url: URL(string: "sdf")!)
return Observable.create { obs in
URLSession.shared.rx.response(request: request).debug("r").subscribe(
onNext: { response in
return obs.onNext(response.data)
},
onError: {error in
obs.onError(error)
})
}
}
我正在订阅它,它会产生错误
send("qwe").subscribe(
onNext: { ev in
print(ev)
}, onError: { error in
print(error)
}).disposed(by: disposeBag)
关于swift - RxSwift URLSession 请求已处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56832692/