2017-01-05 1 views
1

J'ai commencé à apprendre réactif-cacao de quelques jours, aujourd'hui je jouais avec la méthode aplatie de la réactivecocoa (reactiveSwift), j'ai essayé d'exécuter l'extrait donné pour le concat aplatissement dans la documentation Basic operators. Voici l'extrait:ReactiveCocoa - concat aplatir stratégie ne fonctionne pas comme prévu

let (lettersSignal, lettersObserver) = Signal<String, NoError>.pipe() 
let (numbersSignal, numbersObserver) = Signal<String, NoError>.pipe() 
let (signal, observer) = Signal<Signal<String, NoError>, NoError>.pipe() 

signal.flatten(.concat).observeValues { print($0) } 

observer.send(value: lettersSignal) 
observer.send(value: numbersSignal) 
observer.sendCompleted() 

numbersObserver.send(value: "1") // nothing printed 
lettersObserver.send(value: "a") // prints "a" 
lettersObserver.send(value: "b") // prints "b" 
numbersObserver.send(value: "2") // nothing printed 
lettersObserver.send(value: "c") // prints "c" 
lettersObserver.sendCompleted()  // prints "1, 2" 
numbersObserver.send(value: "3") // prints "3" 
numbersObserver.sendCompleted() 

Selon la documentation et le diagramme de visualisation interactive (RAC marbles - flatten(.concat) visual diagram, la sortie aurait dû être quelque chose comme ça,

D'abord, il aurait dû imprimer à-dire de flux de lettre,

a, b, c

& une fois que le letterStream a terminé, il devrait « Ai imprimé le flux de nombre ie

1, 2, 3

Ainsi, le résultat final de cette observation aurait dû être

[a, b, c, 1, 2, 3]

Cependant, la sortie concaténés je vois est,

[a, b, c, 3]

pourquoi est-ce donc? Pourquoi seule la dernière valeur de numberStream est en cours d'impression? Au lieu d'imprimer les valeurs de flux de nombres entiers une fois que le flux de lettres a été terminé.

S'il vous plaît laissez-moi savoir si j'ai mal compris quelque chose. À votre santé.

Répondre

4

Comme mentionné dans le ReactiveSwift's slack channel, c'est le résultat attendu.

Quoting the documentation:

Le flux d'événements extérieur est observée started. Chaque flux d'événement suivant n'est pas observé jusqu'à ce que le précédent soit terminé.

Alors numbersSignal va seulement envoyer des valeurs, une fois que lettersObserver a terminé.

+0

Vous l'avez. Merci :) – iamyogish