我有一个视图模型,可以对待办事项数组进行一些更新。我正在将一组输入映射到操作(建模为枚举中的案例),并将它们合并为一个
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集成并回滚相应的本地更新?
答案 0 :(得分:0)
我建议像该框架一样汇总状态-https://github.com/maxvol/RaspSwift 它还非常依赖 .scan()运算符,因此您会熟悉该方法。 您可以使用它,也可以自己实施类似的解决方案。