Π― ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ», ΡΡΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΊΠ»Π°ΡΡ, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΠΈΠΉΡΡ Π½Π°Π±ΠΎΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΉ ΡΠΈΠ³Π½Π°Π». ΠΡΡΡ Π»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠ»Π΅Π³Π°Π½ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± Π΄ΠΎΠ±ΠΈΡΡΡΡ ΡΠΎΠ³ΠΎ ΠΆΠ΅?
<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