ReactiveSwift:如何编写任务计划程序

gka*_*kas 3 ios reactive-cocoa swift

我正在尝试创建一个调度程序来消耗一些数据。

调度程序必须能够:

  • 每次应手动消耗数据时发送一个事件
  • 每次数据应在上次消费后经过一段时间后自动消费时发送一个事件

我用一个模型模拟了手动消耗MutableProperty

 let consume = MutableProperty<Void>()
Run Code Online (Sandbox Code Playgroud)

我正在尝试用一个模型来模拟自动消耗SignalProducer

 let timer = SignalProducer<Void, NoError>
Run Code Online (Sandbox Code Playgroud)

我可以通过组合这两个生产者的最新值来第一次需要使用该数据,例如

SignalProducer.combineLatest(consume.producer, timer)
    .take(first: 1)
    .map() { _ in return () }
Run Code Online (Sandbox Code Playgroud)

这样,无论哪个先发生,生产者都会发送一个值,无论是手动消耗还是自动消耗。

我不知道我怎样才能永远做到这一点。

有人可以帮忙吗?

mar*_*aie 5

您可以使用定义在中的全局计时器函数来启动计时器ReactiveSwift

public func timer(interval: TimeInterval, on scheduler: DateSchedulerProtocol) -> SignalProducer<Date, NoError>
Run Code Online (Sandbox Code Playgroud)

要将计时器与 Consumer 属性结合起来:

let interval = 10.0
let timerSignal: SignalProducer<Date, NoError> = timer(interval: interval, on: QueueScheduler.main)
let consume = MutableProperty<Void>()

timerSignal.combineLatest(with: consume.producer).startWithValues { (date, v) in
    print("triggered at time: \(date)")
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以通过设置value消耗属性或等待计时器事件来手动触发打印块。