Reactivecocoa: ما هي الطريقة الأكثر أناقة لدمج مجموعة ديناميكية من الإشارات؟

تم إنشاؤها على ٢٤ يونيو ٢٠١٥  ·  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>
question

ال 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 التقييمات