在RXMoyaProvider上设置请求超时

问题描述 投票:0回答:1

我正在使用带有RxSwift的Moya,我正在尝试使用以下代码设置网络调用(API调用)的请求超时:

在声明您的提供商时包括自定义Alamofire Manager

lazy var provider: RxMoyaProvider<CAPProviderAPI> = {
    return RxMoyaProvider<CAPProviderAPI>(endpointClosure: Utility.getEndPointClosure(forProviderType: .authorized), manager: DefaultAlamofireManager.sharedManager, plugins: [NetworkActivityPlugin(networkActivityClosure: networkActivityClosure)])
}()

但我收到一个错误说:使用未解析的标识符'networkActivityClosure'

alamofire rx-swift moya rxalamofire
1个回答
2
投票

我想和你分享我做的方式。它可能无法解答您的问题,但它显示了使用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)
}
© www.soinside.com 2019 - 2024. All rights reserved.