0

当请求失败时我需要修改请求的标头但是当我修改请求时请求不会改变retryWhen

这是我的实现:

func makeRequest(serviceRequest: URLRequest) {
    let maxRetry = 2
    var localRequest = serviceRequest
    request(request: localRequest).retryWhen { errors in
        return errors.enumerated().flatMap { (arg) -> Observable<Int64> in
            localRequest.setValue("someValue", forHTTPHeaderField: "someKey")

            let (index, error) = arg
            return index <= maxRetry ? Observable<Int64>.timer(DispatchTimeInterval.microseconds(4),
                                                               scheduler: MainScheduler.instance) : Observable.error(error)
        }
    }.subscribe(onNext:{ result in
        print(result)

        }).disposed(by: disposeBag)
}

如果我po localRequest在设置标题之后someKey它会显示我的更改,但如果我po request在请求函数中,请求保持不变,没有任何变化。你们中的任何人都知道我可以做些什么来更改中的请求retryWhen

我会非常感谢你的帮助。

4

1 回答 1

0

函数式反应式编程是一种函数式范式。您不必“更改请求”,而是必须生成新请求。我会写得更像这样:

func makeRequest(buildRequest: @escaping (String) -> URLRequest) {
    Observable.deferred {
        request(request: buildRequest(token))
    }
    .retryWhen { (error) in
        error.enumerated().flatMap { (index, error) -> Observable<Void> in
            token = "some value"
            return index <= 2 ?
                Observable.just(()).delay(.microseconds(4), scheduler: MainScheduler.instance) :
                Observable.error(error)
        }
    }
    .subscribe(onNext:{ result in
        print(result)
    })
    .disposed(by: disposeBag)
}
于 2019-12-06T12:11:54.673 回答