Reactivecocoa: рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рд╕реЗрдЯ рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 24 рдЬреВрди 2015  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: ReactiveCocoa/ReactiveCocoa

рдореИрдВ рдПрдХ рдорд░реНрдЬ рдХрд┐рдП рдЧрдП рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рдмрджрд▓рддреЗ рд╕реЗрдЯ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЫреЛрдЯреА рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреНрдпрд╛ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИ?

<strong i="6">@interface</strong> SignalSet : NSObject
<strong i="7">@property</strong> (nonatomic, readonly) RACSignal *mergedSignal;
- (void)addSignal:(RACSignal *)signal;
<strong i="8">@end</strong>

<strong i="9">@implementation</strong> SignalSet

- (instancetype)init {
    self = [super init];

    if (self) {
        _signals = [NSSet new];

        _mergedSignal = [[RACObserve(self, signals) map:^RACSignal *(NSSet *signals) {
            return [RACSignal merge:signals];
        }] switchToLatest];
    }

    return self;
}

- (void)addSignal:(RACSignal *)signal {
    self.signals = [self.signals setByAddingObject:signal];

    [signal finally:^{
        // Remove the signal from the set to release it
        self.signals = [[NSSet alloc] initWithArray:[[self.signals rac_sequence] ignore:signal].array];
    }];
}

<strong i="10">@end</strong>

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдк рд▓рдЧрднрдЧ рдЙрд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ RACSubject рд╕рд╛рде рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

RACSubject *signalSet = [RACSubject subject];
RACSignal *mergedSignals = [signalSet flatten:0];

// Add a signal
[signalSet sendNext:someSignal];

рдмреЗрд╣рддрд░ рдЕрднреА рддрдХ, рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдк RACSubject рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

RACSignal *mergedSignals = [RACSignal never];

// Add a signal
mergedSignals = [mergedSignals merge:someSignal];

рд╡реИрд╕реЗ, -finally: рдореМрдЬреВрджрд╛ рд╕рд┐рдЧреНрдирд▓ рдореЗрдВ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдмрд▓реНрдХрд┐, рдпрд╣ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рд╕рд┐рдЧреНрдирд▓ рджреЗрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реМрдЯрд╛ рд╣реБрдЖ рд╕рдВрдХреЗрдд рддреНрдпрд╛рдЧ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрднреА рднреА рдЗрд╕рдХреА рд╕рджрд╕реНрдпрддрд╛ рдирд╣реАрдВ рд▓реА рдЬрд╛рддреА рд╣реИ:

[signal finally:^{
    // Remove the signal from the set to release it
    self.signals = [[NSSet alloc] initWithArray:[[self.signals rac_sequence] ignore:signal].array];
}];

рдзрдиреНрдпрд╡рд╛рдж! рдореБрдЭреЗ рджреВрд╕рд░рд╛ рд░реВрдк рдкрд╕рдВрдж рд╣реИред

рдЗрд╕рд╕реЗ рдореБрдЭреЗ 2019 рдореЗрдВ рдорджрдж рдорд┐рд▓реАред рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж @brow

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

iby picture iby  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Lewion picture Lewion  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

RuiAAPeres picture RuiAAPeres  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

akashivskyy picture akashivskyy  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gabro picture gabro  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ