0

我正在将 Moya 与 RxSwift 一起使用,我正在尝试按照建议使用以下代码设置网络调用(API 调用)的请求超时:

在声明您的提供者时包括自定义 Alamofire 管理器

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

但我收到一条错误消息:使用未解析的标识符“networkActivityClosure”

4

1 回答 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)
}
于 2018-01-11T01:48:56.760 回答