gpt4 book ai didi

swift - RxSwift 中的乐观 UI 更新

转载 作者:行者123 更新时间:2023-11-30 11:21:03 25 4
gpt4 key购买 nike

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

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

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

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

如何修改或增强此功能以支持 api 集成并在远程更新失败时回滚相应的本地更新?

最佳答案

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

关于swift - RxSwift 中的乐观 UI 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51268740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com