Ich stelle fest, dass ich die folgende kleine Klasse ziemlich oft verwende, um einen sich ändernden Satz von Signalen als ein zusammengeführtes Signal darzustellen. Gibt es eine elegantere Möglichkeit, dasselbe zu erreichen?
<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>
Sicher, Sie können ungefähr die gleiche Schnittstelle mit einem RACSubject
:
RACSubject *signalSet = [RACSubject subject];
RACSignal *mergedSignals = [signalSet flatten:0];
// Add a signal
[signalSet sendNext:someSignal];
Besser noch, je nach Ihren Anforderungen können Sie RACSubject
vermeiden:
RACSignal *mergedSignals = [RACSignal never];
// Add a signal
mergedSignals = [mergedSignals merge:someSignal];
Übrigens fügt -finally:
einem bestehenden Signal keine Nebeneffekte hinzu. Vielmehr gibt es ein neues Signal mit Nebenwirkungen zurück. Folgendes bewirkt nichts, da das zurückgegebene Signal verworfen und nie abonniert wird:
[signal finally:^{
// Remove the signal from the set to release it
self.signals = [[NSSet alloc] initWithArray:[[self.signals rac_sequence] ignore:signal].array];
}];
Vielen Dank! Ich mag die zweite Form.
Das hat mir 2019 geholfen. Vielen Dank @brow