ReactiveCocoa:用重复信号链接信号

时间:2015-02-26 17:03:46

标签: ios reactive-programming reactive-cocoa racsignal

使用ReactiveCocoa,如何从重复的信号中链接信号?

我想做这样的事情: 每隔5秒,我就会运行一次网络请求。

为此,我创建了一个重复信号

RACSignal *each5SecondSignal = [[[RACSignal interval:5 onScheduler:[RACScheduler mainThreadScheduler]] take:1] concat:[RACSignal 5 onScheduler:[RACScheduler mainThreadScheduler]]];

和获取数据的信号

RACSignal* iframeSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {....

但我不知道如何将它们联系起来。这是我的尝试(使用'then'方法)。

//This doesn't work, the log do not appear
[[each5SecondSignal then:^RACSignal *{
   return iframeSignal;
 }] subscribeNext:^(id x) {
   NSLog(@"Request was made");
 }];

然而,当我[iframeSignal subscribeNext...]时,会调用信号的内容,当我这样做时

//OK is logged every 5 seconds
[each5SecondSignal subscribeNext:^(id x) {
    NSLog(@"OK");
  }];

日志按预期显示。

你可以帮帮我吗?

此致

Jery

1 个答案:

答案 0 :(得分:3)

首先,each5SecondSignal可以更加简单。您不必调用take:,因为它会在5秒后完成信号,如果我理解正确,您希望信号永远持续下去。

RACSignal *each5SecondSignal = [RACSignal interval:5 onScheduler:[RACScheduler mainThreadScheduler]]

您可以使用flattenMap:,以便每次iframeSignal发送下一个值(每5秒发生一次)时调用each5SecondSignal

[[each5SecondSignal flattenMap:^RACStream *(id value) {
   return iframeSignal;
 }] subscribeNext:^(id x) {
   NSLog(@"Request was made");
 }];