【问题标题】:Optimistic UI updates in RxSwiftRxSwift 中的乐观 UI 更新
【发布时间】:2018-07-10 15:11:00
【问题描述】:

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

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)
        }
    }

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

根据我的 Observables 的当前结构,我想不出如何做到这一点。例如。 scan 闭包不再存在于 Observables 的世界中,因为它只返回一个 [Todo],所以我不能使用 flatMap 或任何东西发出 api 请求。

如果远程更新失败,如何修改或增强它以支持 api 集成并回滚相应的本地更新?

【问题讨论】:

    标签: swift mvvm rx-swift


    【解决方案1】:

    我建议像这个框架一样聚合状态 - https://github.com/maxvol/RaspSwift 它还严重依赖 .scan() 运算符,因此您会发现这种方法很熟悉。 您可以使用它,也可以自己实现类似的解决方案。

    【讨论】:

      猜你喜欢
      • 2017-11-02
      • 2018-11-21
      • 2016-06-27
      • 1970-01-01
      • 2015-10-28
      • 2016-08-08
      • 1970-01-01
      • 2017-10-18
      • 2015-03-15
      相关资源
      最近更新 更多