RxSwift中的乐观UI更新

时间:2018-07-10 15:11:01

标签: swift mvvm rx-swift

我有一个视图模型,可以对待办事项数组进行一些更新。我正在将一组输入映射到操作(建模为枚举中的案例),并将它们合并为一个

let mergedActions = Observable<TodosAction>.merge([
    todosFromService.map { .fromService(todos: $0) },
    toggleFavoriteSubject.map { .toggleFavorite(identifier: $0) },
    toggleIsReadSubject.map { .toggleIsRead(identifier: $0) }
])

然后,我使用scan“记住”更新的历史记录。

todos = mergedActions
    .scan([]) { (lastTodos, new) -> [Todo] in
        switch new {
        case .fromService(let todos):
            return todos
        case .toggleFavorite(let identifier):
            return lastTodos.withFavoritedToggled(atId: identifier)
        case .toggleIsRead(let identifier):
            return lastTodos.withIsReadToggled(atId: identifier)
        }
    }

我的问题是将网络请求集成到此方法中。例如。我有一个“乐观更新”,在这里我假设成功并更新了内存中的待办事项。但是我也想在服务器上更新它 如果请求失败,则“回滚”该更新。

根据我的Observable的当前结构,我无法考虑如何执行此操作。例如。 scan闭包不再在Observables的世界中,因为它仅返回一个[Todo],因此我无法使用flatMap或其他任何方式进行api请求。

如果远程更新失败,该如何进行修改或扩展以支持api集成并回滚相应的本地更新?

1 个答案:

答案 0 :(得分:0)

我建议像该框架一样汇总状态-https://github.com/maxvol/RaspSwift 它还非常依赖 .scan()运算符,因此您会熟悉该方法。 您可以使用它,也可以自己实施类似的解决方案。