Reactivecocoa: Wie lassen sich dynamische Signale am elegantesten zusammenführen?

Erstellt am 24. Juni 2015  ·  3Kommentare  ·  Quelle: ReactiveCocoa/ReactiveCocoa

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>
question

Alle 3 Kommentare

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen