2017-09-13 3 views
0

J'ai deux signaux de notifications. Ceux-ci ont été tirés d'un cadre externe.Comment combiner deux signaux avec OU

let successSignal = NotificationCenter.default.reactive.notifications(forName: NSNotification.Name(rawValue: "someNotification")) 
let failedSignal = NotificationCenter.default.reactive.notifications(forName: NSNotification.Name(rawValue: "someNotification")) 

Maintenant, je veux les combiner à un signal de type Signal<Notification, Error>. Si successSignal incendie envoie une valeur, si failedSinal déclenche une erreur.

Je n'ai aucune idée de comment gérer cela.

Répondre

0

Voici une façon de le faire:

enum SignalErrors: Error { 
    case failedSignalValue 
} 

let failingFailed = failedSignal.flatMap(FlattenStrategy.latest) { _ in 
    return SignalProducer<Int, SignalErrors>(error: SignalErrors.failedSignalValue) 
} 

Pour ce nouveau signal, une valeur sur le failedSignal sera transformé en un événement error, donc failingFailed est un signal sur lequel les événements sur failedSignal arrivent maintenant .failed au lieu de .value. Gardez à l'esprit les Event Stream Grammar - après un événement .failed, le signal se termine!

let merged = Signal.merge([ 
    successSignal 
     .promoteError(SignalErrors.self), 
    failingFailed 
]) 

Ensuite, nous fusionnons le signal successSignal et failingFailed ensemble. Since a .failed event behaves like an exception and propagates immediately, le signal fusionné entier échouera également immédiatement lorsqu'un événement .failed arrive sur failingFailed. Le promoteError sur successSignal est nécessaire pour des raisons de vérification de type.