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 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ

Π‘ΠΌΠ΅ΠΆΠ½Ρ‹Π΅ вопросы

andersio picture andersio  Β·  22ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

andersio picture andersio  Β·  15ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

RuiAAPeres picture RuiAAPeres  Β·  15ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

NachoSoto picture NachoSoto  Β·  20ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

nickvelloff picture nickvelloff  Β·  10ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ