1

我有两个Event对象信号。Event对象有一个date属性,该属性设置为事件创建的日期。这两个信号在创建时发送事件。

我想创建第三个信号:

  • event2.date在 的任一侧落在 1 秒内时event1.date,发送一个包含两个事件的元组
  • 当最近的 1 秒后过去event1.date,并且最近event2date不在有效范围内时,发送一个仅包含的元组event1

我正在使用combineLatest:andfilter创建一个信号,该信号使用第一个条件过滤元组:

[[RACSignal combineLatest:@[ signal1, signal2 ]]
    filter:^BOOL(RACTuple *tuple) {
        RACTupleUnpack(Event *event1, Event *event2) = tuple;

        NSDate *startDate = [event1.date dateByAddingTimeInterval:-1];
        NSDate *endDate = [event1.date dateByAddingTimeInterval:1];

        if ([event2.date compare:startDate] == NSOrderedAscending) return NO;
        if ([event2.date compare:endDate] == NSOrderedDescending) return NO;

        return YES;
    }];

如何制作包含这两个标准的信号?

4

1 回答 1

0

这个解决方案对我有用,虽然我不确定它是否是最优雅的解决方案。

signal2是使用RACReplaySubject容量为的多播1,以便能够从该信号中获取最后一个值,即使它发生在来自 的最新值之前signal1

[[signal1
    map:^RACSignal *(Event *event1) {
        RACSignal *interval = [[[RACSignal interval:RemoteTimeAfter onScheduler:[RACScheduler mainThreadScheduler]]
            map:^id(id value) {
                return RACTuplePack(event1);
            }]
            take:1];

        RACSignal *filteredSignal2 = [[signal2
            filter:^BOOL(Event *event2) {
                NSDate *startDate = [event.date dateByAddingTimeInterval:-1];
                NSDate *endDate = [event.date dateByAddingTimeInterval:1];

                if ([event2.date compare:startDate] == NSOrderedAscending) return NO;
                if ([event2.date compare:endDate] == NSOrderedDescending) return NO;

                return YES;
            }]
            map:^RACTuple *(Event *event2) {
                return RACTuplePack(event1, event2);
            }];

        return [[RACSignal merge:@[ interval, filteredSignal2 ]] take:1];
    }]
    flatten];
于 2013-11-22T13:56:17.997 回答