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