reactive cocoa - ReactiveCocoa finally never be called with already completed replaySubject. Is it expected behavior? -
is expected behavior?
racsubject *subject = [racreplaysubject replaysubjectwithcapacity:1]; [subject sendcompleted]; [subject finally:^{ nslog(@"never called"); }]; [subject subscribecompleted:^{ nslog(@"called"); }]; if so, how have finally block? need this?
void (^block)() = ^ { nslog(@"like finally!"); }; [subject subscribeerror:^(nserror *error) { block(); } completed:^{ block(); }]; edit: misunderstand finally me, the document renamed dofinished in rac 3.0 may understand, instead of the 2.x document.
it's unrelated fact signal has completed. consider this:
racsubject *subject = [racsubject subject]; [subject finally:^{ nslog(@"never called"); }]; [subject subscribecompleted:^{ nslog(@"called"); }]; [subject sendcompleted]; still never called! why? because finally: returns new signal; doesn't modify existing signal. new signal perform side effects whenever sends completed or error 1 of subscribers. if doesn't have subscribers, side effects never take place. let's subscribe signal finally: returns:
racsubject *subject = [racreplaysubject replaysubjectwithcapacity:1]; [subject sendcompleted]; [[subject finally:^{ nslog(@"called now!"); }] subscribecompleted:^{ nslog(@"called"); }]; that works, might not want. finally: doesn't inject side effects signal, injects side effects each subscription signal. following thing:
racsubject *subject = [racreplaysubject replaysubjectwithcapacity:1]; [subject sendcompleted]; racsignal *signalwithfinally = [subject finally:^{ nslog(@"finally block"); }]; [signalwithfinally subscribecompleted:^{ nslog(@"first subscriber completed"); }]; [signalwithfinally subscribecompleted:^{ nslog(@"second subscriber completed"); }]; will perform finally: block twice, may not want. subscribeerror:completed: may better choice use case.
Comments
Post a Comment