32 votes

Combine : comment remplacer/corriger une erreur sans compléter l'éditeur original ?

Étant donné le code suivant :

    enum MyError: Error {
        case someError
    }

    myButton.publisher(for: .touchUpInside).tryMap({ _ in
        if Bool.random() {
            throw MyError.someError
        } else {
            return "we're in the else case"
        }
    })
        .replaceError(with: "replaced Error")
        .sink(receiveCompletion: { (completed) in
            print(completed)
        }, receiveValue: { (sadf) in
            print(sadf)
        }).store(in: &cancellables)

Chaque fois que j'appuie sur le bouton, j'obtiens we're in the else case jusqu'à Bool.random() est vrai - maintenant une erreur est déclenchée. J'ai essayé différentes choses, mais je n'ai pas réussi à attraper/remplacer/ignorer l'erreur et à continuer après avoir appuyé sur le bouton.

Dans l'exemple de code, j'aimerais avoir par exemple la sortie suivante

we're in the else case
we're in the else case
replaced Error
we're in the else case
...

Au lieu de cela, j'obtiens finished après le replaced error et aucun événement n'est émis.

Modifier Étant donné un éditeur avec AnyPublisher<String, Error> comment puis-je le transformer en un AnyPublisher<String, Never> sans terminer lorsqu'une erreur se produit, c'est-à-dire ignorer les erreurs émises par l'éditeur original ?

-1voto

Vyacheslav Points 2149

Je suggère d'utiliser Publisher avec typealias Failure = Never et la sortie comme un résultat facultatif : typealias Output = Result<YourSuccessType, YourFailtureType>

-1voto

KIO Points 1494

L'éditeur émet jusqu'à ce qu'il termine ou échoue (avec une erreur), après quoi le flux sera terminé.

Une façon de surmonter ce problème est d'utiliser un résultat comme type de publication.

Editeur

protocol SerivceProtocol {
    var value: Published<Result<Double, MyError>>.Publisher { get }
}

Abonné

service.value
        .sink { [weak self] in
            switch $0 {
            case let .success(value): self?.receiveServiceValue(value)
            case let .failure(error): self?.receiveServiceError(error)
            }
        }
        .store(in: &subscriptions)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X