Comment s'abonner directement un signal de signal sans flattenMap lors de l'utilisation de ReactiveCocoa?

StackOverflow https://stackoverflow.com//questions/23015828

  •  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.

Était-ce utile?

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 mapping et puis tout de suite flattenMapping?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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top