Comment s'abonner directement un signal de signal sans flattenMap lors de l'utilisation de ReactiveCocoa?
-
21-12-2019 - |
Question
J'ai une méthode qui renvoie un signal de signal et que je dois utiliser flattenMap
pour extraire la valeur enveloppé dans le signal.Après cela, seulement puis-je utiliser subscribeNext:complet:pour obtenir la valeur.
Le code se présente comme suit:
- (RACSignal *)publicSignal {
return [[self privateSignal] map:^id(NSString *code) {
return [self chainingSignalUsingCode:code];
}];
};
[[[obj publicSignal] flattenMap:^id(id value) {
return value;
}] subscribeNext:^(NSString *someValue) {
// extract the value;
} completed:^{
// something to do..
}];
Est-il possible d'éliminer les flattenMap
le code de sorte que je peux directement vous abonner à la publicSignal
?
Merci à l'avance.
La solution
Eh bien, vous pourriez faire l' flattenMap
à l'intérieur de publicSignal
...
- (RACSignal *)publicSignal {
return [[[self privateSignal] map:^id(NSString *code) {
return [self chainingSignalUsingCode:code];
}] flattenMap:^(id value) {
return value;
}];
}
[[obj publicSignal] subscribeNext:^(NSString *someValue) {
// extract the value;
} completed:^{
// something to do..
}];
Mais alors, pourquoi sommes-nous map
ping et puis tout de suite flattenMap
ping?Il suffit de dire:
- (RACSignal *)publicSignal {
return [[self privateSignal] flattenMap:^(NSString *code) {
return [self chainingSignalUsingCode:code];
}];
}
[[obj publicSignal] subscribeNext: ...
Pour obtenir le même effet.
Gardez à l'esprit que flattenMap
n'est pas vraiment "l'extraction de la valeur dans le signal." C'est l'extraction de tous les valeurs de tous les signaux.Lorsque privateSignal
envoie de nouveaux signaux, publicSignal
va à la prochaine pour chaque valeur chaque signal envoie-il est fondamentalement allait se souvenir de tous les anciens signaux privateSignal
envoie et avant tout de leur nexts à travers.Si c'est ce que vous voulez, puis une grande, il fonctionne.Mais si vous voulez seulement de "déballer" les derniers du signal, l'utilisation switchToLatest
au lieu de flattenMap
.
Si vous ne voulez pas modifier publicSignal
, et vous voulez qu'il soit un signal de signaux, vous pouvez utiliser la plus simple flatten
méthode et vous y inscrire:
[[[obj publicSignal] flatten] subscribeNext: ...
Depuis flattenMap
sans rien faire, est équivalent à flatten
(en fait flatten
est mis en œuvre comme un flattenMap
qui ne renvoie sa valeur).Ou, si vous voulez vous abonner à nexts du dernier signal qu'il envoie:
[[[obj publicSignal] switchToLatest] subscribeNext: ...
Mais tant que c'est un signal de signaux, vous devez faire une opération de "déballer" il.il n'y a aucune aide flattenAndThenSubscribe
méthode -- ce qui est bon.Vous pouvez obtenir l'effet que vous souhaitez au travers de la composition de simples primitives.