我有一个输出信号,当给定的一组定时器超时、完成或整个列表被重置时,它应该输出。
enum DeviceActionStatus {
case pending
case completed
case failed
}
struct DeviceAction {
let start: Date
let status: DeviceActionStatus
func isTimedOut() -> Bool // if start is over 30 seconds ago
let id: String
}
输出信号:
let pendingActionUpdated: Signal<[DeviceAction], NoError>
输入:
let completeAction: Signal<String, NoError>
let tick: Signal<Void, NoError> // runs every 1 second and should iterate to see if any DeviceAction is timed out
let addAction: Signal<DeviceAction, NoError>
let resetAllActions: Signal<Void, NoError>
它应该输出所有正在运行的设备操作的数组。
let output = Signal.combineLatest(
addAction,
resetAllActions,
tick,
Signal.merge(
completeAction,
tick.take(first: 1).map { _ in "InvalidActionId" }
)) // make sure the combinelatest can fire initially
我已经尝试将其发送到 .scan 以在每次触发时累积addAction
,并在每次触发时重置resetAllActions
,但由于无法知道其中的触发,我无法使逻辑正常工作。我怎样才能既累积一个不断增长的列表,同时又能够运行它并能够在我想要的时候重置它?