2013-11-20 18 views
1

我有兩個信號Event對象。 Event對象具有date屬性,該屬性設置爲創建事件的日期。這兩個信號在創建時發送事件。使用值以及當前日期來過濾ReactiveCocoa信號

我想創建的第三信號,其中:

  • 當上的event1.date任一側在1秒內event2.date下降時,發送包含兩個事件
  • 當後最近 event1.date1秒傳遞
  • 一個元組,和最近event2date不在有效範圍內,發送一個元組只包含event1

我我們荷蘭國際集團combineLatest:filter創建使用的第一準則,其過濾的元組的信號:

[[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; 
    }]; 

我怎樣才能讓這既包括標準的信號?

+0

我不能肯定,這將有助於在這裏,但你看着['-bufferWithTime:onScheduler:'](https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/ReactiveCocoaFramework/ReactiveCocoa /RACSignal%2BOperations.h#L137)? –

+1

我不確定我是否理解您的要求,但是是否是兩個相反的標準?換句話說,你是說在'signal1'或'signal2'上發送的值總是會導致發送'(event1)'或'(event1,event2)'?我問,因爲如果是這樣,你可以改變你的'-filter:'到'-map:',然後用前者(只是'event1'的元組)替換'NO'布爾值,並替換'YES'布爾值與後者('event1'和'event2'的元組)。 – erikprice

+0

從我讀到的問題中,您已經得到了解決方案@erikprice。 –

回答

0

該解決方案適用於我,但我不確定它是否是最優雅的解決方案。

signal2組播是爲了利用與1容量的RACReplaySubject才能夠得到這個信號,即使它從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];