Swift。结合。重试时是否可以多次调用发布者块?

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

我想使用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)")
})

PlaygroundPage.current.needsIndefiniteExecution = true

我希望在发生某些错误之前调用backgroundQueue.asyncAfter(deadline) 3次。有人知道为什么吗?

swift combine
1个回答
0
投票

我设法通过使用tryCatch()功能并提出了另一个请求:Link]实现了预期的行为>

© www.soinside.com 2019 - 2024. All rights reserved.