3

指定された一連のタイマーのいずれかがタイムアウトしたとき、完了したとき、またはリスト全体がリセットされたときに出力する必要がある出力信号があります。

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たかを知る方法がないため、ロジックを機能させることができません。成長するリストを累積しながら、必要なときにリストを実行してリセットできるようにするにはどうすればよいですか?

4

2 に答える 2

2

これは、マージ/列挙パターンの仕事のようです。私自身はRxSwiftの方が好きですが、各シグナルを列挙型にマッピングしてマージすると、それらをスキャンに適切に受け取ることができます...

enum ActionEvent {
    case complete(String)
    case tick
    case add(DeviceAction)
    case reset
}

merge(
    completeAction.map { ActionEvent.complete($0) },
    tick.map { ActionEvent.tick },
    addAction.map { ActionEvent.add($0) },
    resetAllActions.map { ActionEvent.reset }
).scan([DeviceAction]()) { actions, event in 
    switch event {
    case let .complete(id):
        return actions.filter { $0.id != id }
    case .tick:
        return actions.filter { $0.isTimedOut() == false }
    case let .add(action):
        return actions + [action]
    case .reset:
        let resetDate = Date()
        return actions.map { $0.start = resetDate }
        // or
        return []
        // depending on what "reset" means.
}
于 2018-11-05T14:29:32.973 に答える