Objective c 每X秒采集一个信号,删除所有其他信号

Objective c 每X秒采集一个信号,删除所有其他信号,objective-c,reactive-cocoa,Objective C,Reactive Cocoa,我想每隔10秒对StartRangBeaconsSignal(每~1秒触发一次)进行采样,每次都得到最新的结果 据我所知,这不是油门功能的目的,它实际上似乎只在X时间段过去而没有收到任何东西时发送Next 我在下面的尝试将信号限制为每10秒仅发送一次next。然而,它不会丢弃临时信号,而是将它们排成队列,每10秒发送一次。所以,在StartTrangBeaconsSignal完成发送很久之后,我们仍然可以从中获得滴灌式的结果 所以本质上,我需要一种方法,每10秒接收一次最新的信号,并忽略所有其他

我想每隔10秒对
StartRangBeaconsSignal
(每~1秒触发一次)进行采样,每次都得到最新的结果

据我所知,这不是油门功能的目的,它实际上似乎只在X时间段过去而没有收到任何东西时发送Next

我在下面的尝试将信号限制为每10秒仅发送一次
next
。然而,它不会丢弃临时信号,而是将它们排成队列,每10秒发送一次。所以,在
StartTrangBeaconsSignal
完成发送很久之后,我们仍然可以从中获得滴灌式的结果

所以本质上,我需要一种方法,每10秒接收一次最新的信号,并忽略所有其他信号。任何指向正确方向的指示都将受到感激

[[[[BeaconManager sharedInstance] startRangingBeaconsSignal]
        sample:[RACSignal interval:10 onScheduler:[RACScheduler mainThreadScheduler]]]
        subscribeNext:^(NSArray *beacons) {
            // do something with beacons array
        }
    ];

提前感谢,并为我的术语含糊不清表示歉意。

我们正在做类似的事情。我不确定这是否是最好的方法,但它确实有效


基本上,设置一个循环信号,该信号的间隔为1秒,并带有
take:10
,以便自动停止。然后对来自该信号的下一个事件执行
映射
,忽略发送的值。在
map
方法中,返回一个新信号,该信号表示要执行的工作。然后您只需
切换到latest
即可订阅每个信号发送的对象

所以
节流阀:
正是你想要的。从文件中:

仅当我们在
间隔
秒内未收到另一个
next
时,才发送
next
s

如果接收到一个
next
,然后在
interval
秒之前接收到另一个
next
,则丢弃第一个值

自最近的
next
发送以来的
interval
秒过后,最新的
next
将在最初接收值的计划程序上转发。如果当时+[RACScheduler currentScheduler]为零,则使用专用后台计划程序

返回一个信号,该信号发送限制和延迟的
下一个
事件。完成和错误总是立即转发


因此,您可以链接
节流阀:
distinctUntilChanged
,以仅获取最新的值

我最终发现正确的解决方案是使用
sample:
和一个间隔,设置为您希望(惊喜)“采样”信号的频率:

/* countingUpwardsSignal is simply a signal returning x, x+1, x+2, and so on */

NSDate *startDate = [NSDate date];
RACSignal *countingUpwardsSignal = [[[RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]]
    startWith:startDate]
    map:^id (NSDate *newDate) {
        return @((int)[newDate secondsLaterThan:startDate]);
    }];


/* fiveSecondsSampleSignal fires once every five seconds, 
   it is used to gate our subscription to countingUpwardsSignal: */

RACSignal *fiveSecondsSampleSignal = [RACSignal interval:5 onScheduler:[RACScheduler mainThreadScheduler]];

/* we combine the frequency of fiveSecondsSampleSignal to pull 
   the latest value from countingUpwardsSignal: */
[[countingUpwardsSignal sample:fiveSecondsSampleSignal] subscribeNext:^(id x) {
    NSLog (@"x: %@", x);
}];
返回:

x: 5
x: 10
x: 15
x: 20
x: 25
x: 30
x: 35
x: 40
这正是我需要的

编辑:
事实上,正如所指出的,这与我发布的原始代码完全相同。。duh这是一种不希望通过节流来降低代码复杂性的情况。不幸的是,BTLE并不像曾经希望的那样高效。因此,您必须手动处理开始测距和开始测距调用。对CoreBluetooth的呼叫仍然会发生,并会延长电池寿命。这相当于每米打一次无关的GPS电话,然后“放弃”它们,因为你只需要每10米打一次。或者每0.1秒轮询一个服务器,但只响应第10个服务器

谢谢阿什,但我不确定这是否正确回答了这个问题。你的建议是每秒钟进行一次工作,持续10秒,然后停止——我想是吧?实际上我想问的是:假设你有一个信号a,它会间歇性地(大约每一秒或两秒)发射,直到永远。我们想要的是每10秒对信号A进行一次采样,并从中获取在该点的最后一个值。自上次采样以来发送的所有其他内容都将被丢弃。因此,假设信号A每秒触发一次,发送[A、B、C、D、E、F、G、H、I、J、K、L],如果我们订阅它,我们希望接收A,然后(10秒后)接收K。所有其他内容都将被丢弃。我认为我正在寻找的内容可以使用CombineRelatestWith:,如果它正常工作,我会发回。“然而,它不会丢弃临时信号,而是将它们排成队列,每10秒发送一次。所以,在
StartTrangBeaconsSignal
完成发送很久之后,我们仍然可以从中获得滴灌式的结果“。请尝试对其进行一次最低限度的修改-
sample
不是这样工作的。它完全符合您所描述的内容--您在
subscribebenext
中做了什么?这不正是您在原始问题中发布的代码吗?原始问题中一定存在其他错误,这意味着我没有看到
示例: