Reactivecocoa: Apa cara paling elegan untuk menggabungkan serangkaian sinyal dinamis?

Dibuat pada 24 Jun 2015  ·  3Komentar  ·  Sumber: ReactiveCocoa/ReactiveCocoa

Saya menemukan diri saya menggunakan kelas kecil berikut sedikit untuk menyajikan satu set sinyal yang berubah sebagai satu sinyal yang digabungkan. Apakah ada cara yang lebih elegan untuk mencapai hal yang sama?

<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

Semua 3 komentar

Tentu, Anda dapat mencapai antarmuka yang kurang lebih sama dengan RACSubject :

RACSubject *signalSet = [RACSubject subject];
RACSignal *mergedSignals = [signalSet flatten:0];

// Add a signal
[signalSet sendNext:someSignal];

Lebih baik lagi, tergantung pada kebutuhan Anda, Anda mungkin dapat menghindari RACSubject :

RACSignal *mergedSignals = [RACSignal never];

// Add a signal
mergedSignals = [mergedSignals merge:someSignal];

Omong-omong, -finally: tidak menambahkan efek samping pada sinyal yang ada. Sebaliknya, ia mengembalikan sinyal baru dengan efek samping. Berikut ini tidak melakukan apa pun karena sinyal yang dikembalikan dibuang dan tidak pernah berlangganan:

[signal finally:^{
    // Remove the signal from the set to release it
    self.signals = [[NSSet alloc] initWithArray:[[self.signals rac_sequence] ignore:signal].array];
}];

Terima kasih! Saya suka bentuk kedua.

Ini membantu saya di tahun 2019. Terima kasih banyak @brow

Apakah halaman ini membantu?
0 / 5 - 0 peringkat