【发布时间】:2019-07-01 08:54:19
【问题描述】:
我正在学习使用 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: APIRequest>(_ request: T) -> Observable<T.Response>的返回值怎么办? -
@Andrew 添加了调用代码。
-
我确实有那行,我抄错了,对不起。我确实有那条线。
-
你是在某处取消这个
disposeBag还是创建一个新的? -
此时,它是一个
let disposeBag = DisposeBag()作为 AppDelegate 中的属性,因为我想测试客户端。