RACSignal post-event side effect
Those of you using ReactiveCocoa and signals probably know about injecting side effects in signals pipelines using -doNext:, -doCompleted:, -doError:. Framework will execute block given to these methods and then propagate corresponding event forward.
Sometimes however, you want to insert side effect after event was propagated. Here's example: suppose you RACSignal sending error messages as some action being performed or nil when error message should be dismissed. You bind that message to some UILabel's text property:
RAC(self, someLabel.text) = errorMessagesSignal;
Now, you want to inject a piece of code adding fade animation every time that text changes. But you can't inject that as -doNext: side effect, because that way animation will be added to label's previous state and you won't see new text appeared.
Here's a trick to inject side effect after new text gets set to that label:
RAC(self, someLabel.text) = [errorMessageSignal flattenMap:^RACStream *(id value) {
return [[RACSignal return:value] doCompleted:^ {
<side effect here>
}]
}];
In this case new value coming from errorMessageSignal will be sent all the way through, get set to labels' text property and then side effect executed.