Aqueles de vocês usando ReactiveCocoa e sinais provavelmente sabe sobre injeção de efeitos colaterais em sinais de dutos utilizando -doNext:
, -doCompleted:
, -doError:
. O framework irá executar o bloco dado a esses métodos e então propagar o evento correspondente para frente.
Às vezes, no entanto, você deseja inserir um efeito colateral após a propagação do evento. Aqui está um exemplo: suponha que você esteja RACSignal
enviando mensagens de erro como alguma ação sendo executada ou nil
quando a mensagem de erro deve ser descartada. Você vincula essa mensagem a alguma UILabel
propriedade de texto de:
RAC(self, someLabel.text) = errorMessagesSignal;
Agora, você deseja injetar um pedaço de código adicionando animação de fade cada vez que o texto muda. Mas você não pode injetar isso como -doNext:
efeito colateral, porque assim a animação será adicionada ao estado anterior do rótulo e você não verá o novo texto aparecer.
Aqui está um truque para injetar efeito colateral após o novo texto ser definido para esse rótulo:
RAC(self, someLabel.text) = [errorMessageSignal flattenMap:^RACStream *(id value) {
return [[RACSignal return:value] doCompleted:^ {
<side effect here>
}]
}];
Nesse caso, o novo valor proveniente de errorMessageSignal
será enviado por completo, defina a propriedade de texto dos rótulos e, em seguida, o efeito colateral será executado.