在 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 上设置请求超时的主要内容,如果未能解决你的问题,请参考以下文章

Vue项目请求超时处理

ajax响应时长怎样设置?

http超时请求设置

http超时请求设置

微信小程序 请求超时处理

关于TOMCAT响应超时请求重发的问题