Como assinar diretamente um sinal de sinal sem flattenMap quando usando ReactiveCocoa?

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

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

Foi útil?

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 mapping e, em seguida, imediatamente flattenMapping?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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top