在 RXMoyaProvider 上设置请求超时
Posted
技术标签:
【中文标题】在 RXMoyaProvider 上设置请求超时【英文标题】:Set request timeout on RXMoyaProvider 【发布时间】:2018-01-10 12:39:50 【问题描述】:我正在将 Moya 与 RxSwift 一起使用,我正在尝试按照建议使用以下代码设置网络调用(API 调用)的请求超时:
在声明您的 Provider 时包括自定义 Alamofire 管理器
lazy var provider: RxMoyaProvider<CAPProviderAPI> =
return RxMoyaProvider<CAPProviderAPI>(endpointClosure: Utility.getEndPointClosure(forProviderType: .authorized), manager: DefaultAlamofireManager.sharedManager, plugins: [NetworkActivityPlugin(networkActivityClosure: networkActivityClosure)])
()
但我收到一条错误消息:使用未解析的标识符“networkActivityClosure”
【问题讨论】:
【参考方案1】:我想与您分享我的做法。它可能无法回答您的问题,但它展示了使用 RxSwift 运算符实现所需行为的方法。
我有一些函数接受超时参数并发出请求:
func request(timeout: TimeInterval, ...other params) -> Observable<...>
在这个函数中,我通过这种方式将超时转换为Observable
:
func observableTimeout(timeout: TimeInterval, ...other params) -> Observable<...>
return Observable<Int>
.timer(timeout, period: ..., scheduler: ...)
.take(1)
.map(to: ...) // map to timeout error
如果发生超时 - 我需要取消请求。我做了一些flatMapLatest
模拟,它也接受取消信号:
public extension Observable
public func flatMapLatest<T>(cancel: Observable<T>, factory: @escaping (E) throws -> Observable<T>) -> Observable<T>
let observableNormal = self
.flatMap( try factory($0) )
return Observable<Observable<T>>
.of(cancel, observableNormal)
.merge()
.take(1)
因此,请求函数将以这种方式工作:
func request(timeout: TimeInterval, ...other params) -> Observable<...>
let cancel = observableTimeout(timeout: timeout, ...)
let factory = ...// your observable factory which makes a request using Moya
return Observable
.just((), scheduler: ...)
.flatMapLatest(cancel: cancel, factory: factory)
【讨论】:
以上是关于在 RXMoyaProvider 上设置请求超时的主要内容,如果未能解决你的问题,请参考以下文章