ios - ReactiveCocoa : Chain a signal with a repeating signal

标签 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");
  }];

日志按预期显示。

你能帮帮我吗?

真诚的

杰瑞

最佳答案

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

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

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

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

关于ios - ReactiveCocoa : Chain a signal with a repeating signal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28748408/

相关文章:

spring - Spring 应用程序事件的典型用例是什么?

c# - 大理石图

javascript - 使用没有前缀延迟的sampleTime 运算符?

ios - 用于从本地数据库进行过滤的 SQLite 查询是什么?

ios - 在 ios 中获取 token 时遇到问题

ios - 即使应用程序在 swift 4 中处于事件状态,调用屏幕也会在接受 twilio 语音调用时关闭

afnetworking - 使用 ReactiveCocoa 组合多个网络请求

ios - 使用 react 性 cocoa 处理链接请求的最佳实践

ios - ReactiveCocoa 4.0 :- Unable to map the NSURLSession. sharedSession().rac_dataWithRequest

ios - navigationController 在 Swift 上意外发现 nil