RXSwift:如果请求在`retryWhen`中失败,则修改URLRequest >>

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

当请求失败时,我需要修改请求的标头,但是当我在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中的请求?

非常感谢您的帮助。

当请求失败时,我需要修改请求的标头,但是当我在retry中修改请求时,请求不会改变。这是我的实现:func makeRequest(serviceRequest:...

observable ios13 rx-swift urlrequest xcode11.2
1个回答
0
投票

Functional Reactive Programming是一种功能范式。您不必“更改请求”,而必须生成一个新请求。我会这样写:

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)
}
© www.soinside.com 2019 - 2024. All rights reserved.