Установите время ожидания запроса на RXMoyaProvider

Я использую Moya с RxSwift и пытаюсь установить время ожидания запроса для сетевого вызова (вызовы API), используя приведенный ниже код, как предложено:

который включает пользовательский Alamofire Manager при объявлении вашего провайдера

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

но я получаю сообщение об ошибке: Использование неразрешенного идентификатора 'networkActivityClosure'


person i70ro    schedule 10.01.2018    source источник


Ответы (1)


Хочу поделиться с вами тем, как я это сделал. Возможно, это не ответ на ваш вопрос, но он показывает способ достижения желаемого поведения с помощью операторов RxSwift.

У меня есть функция, которая принимает параметр тайм-аута и делает запрос:

func request(timeout: TimeInterval, ...other params) -> Observable<...>

Внутри этой функции я преобразовываю timeout в 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)
}
person iWheelBuy    schedule 11.01.2018