当使用 Swift/Combine 中的 retry() 发生某些错误时,我想多次发出网络请求。发布者内部的块只被调用一次,这意味着当发生错误时,对真正的应用程序只有一个请求。我的代码是:
import UIKit
import Combine
import PlaygroundSupport
enum TestFailureCondition: Error {
case invalidServerResponse
}
var backgroundQueue: DispatchQueue = DispatchQueue(label: "backgroundQueue")
var failPublisher: AnyPublisher<(Data, URLResponse), Error> {
Future<(Data, URLResponse), Error> { promise in
print("Attempt to call")
backgroundQueue.asyncAfter(deadline: .now() + Double.random(in: 1..<3)) {
promise(.failure(TestFailureCondition.invalidServerResponse))
}
}
.eraseToAnyPublisher()
}
let cancellable = failPublisher
.print("(1)>")
.retry(3)
.print("(2)>")
.sink(receiveCompletion: { fini in
print(" ** .sink() received the completion:", String(describing: fini))
PlaygroundPage.current.finishExecution()
}, receiveValue: { stringValue in
print(" ** .sink() received \(stringValue)") …Run Code Online (Sandbox Code Playgroud) 我需要在组合中实现超时函数的处理程序。让我们考虑以下代码结构:
SomeKindOfPublisher<Bool, Never>()
.timeout(timeoutInterval, scheduler: backgroundQueue,
customError: { [weak self] () -> Never in
...
while true {} // This block should not return because of Never
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何避免出现奇怪的线条while true {}?我不想将 Never 更改为 Error 类型。