Como assinar diretamente um sinal de sinal sem flattenMap quando usando ReactiveCocoa?
-
21-12-2019 - |
Pergunta
Eu tenho um método que retorna um sinal de sinal e eu tenho que usar flattenMap
para extrair o valor envolvido no sinal.Depois disso só posso usar subscribeNext:complete:para obter o valor.
O código se parece com o seguinte:
- (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..
}];
Existe alguma forma de eliminar a flattenMap
o código para que eu possa assinar diretamente para o publicSignal
?
Obrigado antecipadamente.
Solução
Bem, você poderia apenas fazer o flattenMap
dentro 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..
}];
Mas então por que estamos map
ping e, em seguida, imediatamente flattenMap
ping?Só podemos dizer:
- (RACSignal *)publicSignal {
return [[self privateSignal] flattenMap:^(NSString *code) {
return [self chainingSignalUsingCode:code];
}];
}
[[obj publicSignal] subscribeNext: ...
Para obter o mesmo efeito.
Tenha em mente que flattenMap
não é realmente "extraindo o valor do sinal." Extrair todos os valores de todos os sinais.Quando privateSignal
envia sinais novos, publicSignal
vai avançar para todos valor que todos sinal envia-é basicamente vai se lembrar de todos os últimos sinais de que privateSignal
envia e encaminhar todos os seus nexts meio.Se é isso que você quer, em seguida, grande, ele funciona.Mas se você apenas deseja "abrir" o mais recente sinal de uso switchToLatest
em vez de flattenMap
.
Se você não quer modificar publicSignal
, e você quer que ele seja um sinal dos sinais, você pode usar o mais simples flatten
método e se inscrever para que:
[[[obj publicSignal] flatten] subscribeNext: ...
Desde flattenMap
sem fazer nada é equivalente a flatten
(na verdade, flatten
é implementado como um flattenMap
que apenas retorna o seu valor).Ou, se você quiser apenas para subscrever nexts da mais recente sinal de que ele envia:
[[[obj publicSignal] switchToLatest] subscribeNext: ...
Mas enquanto é um sinal dos sinais, você precisa fazer alguma operação para "desvendar" a ele.não há auxiliar de flattenAndThenSubscribe
método-o que é bom.Você pode obter o efeito que você quer através da composição de simples e primitivos.