У меня есть выходной сигнал, который должен выводиться, когда один из заданных таймеров истекает, завершается или когда весь список сбрасывается.
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
, но, поскольку нет способа узнать, кто из этих уволен, я могу не получайте логику для работы. Как я могу как накапливать растущий список, так и иметь возможность просматривать его и сбрасывать, когда захочу?