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