рдореИрдВ рдПрдХ рдорд░реНрдЬ рдХрд┐рдП рдЧрдП рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рдмрджрд▓рддреЗ рд╕реЗрдЯ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЫреЛрдЯреА рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреНрдпрд╛ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИ?
<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>
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдк рд▓рдЧрднрдЧ рдЙрд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ 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