【发布时间】:2018-06-20 05:27:20
【问题描述】:
我有一个呈现“节点”列表的虚拟机。每个节点都有一个isCompleted 和isRead 属性。它们在表格视图中呈现,每个单元格都有用于切换这些属性的按钮。
在页面加载时,我从服务器获取列表。现在,我只想更新这些节点。在我的虚拟机中,我尝试了 20 多种方法,包括各种运算符、策略、方法等。但每次尝试总是存在相同的问题。
我知道这实际上只是在更新某些东西,或者 View -> ViewModel 通信。尽管如此,我已经花费了令人尴尬的时间来绞尽脑汁尝试对此进行建模。所以我肯定错过了 RxSwift、MVVM 以及如何为突变建模的一些非常基本的方面。
这是我最近的尝试。
let updates = Observable<(NodeIdentifier, AttribUpdate)?>.merge([
toggleMarkReadSubject.map { ($0, AttribUpdate.isRead) },
toggleFavoriteSubject.map { ($0, AttribUpdate.isFavorited) }
]).startWith(nil)
nodes = Observable.combineLatest(dataFromService, updates, resultSelector: { (nodes, update) in
guard let update = update else { return nodes }
switch update.1 {
case .isFavorited:
return nodes.withFavoritedToggled(atId: update.0)
case .isRead:
return nodes.withMarkReadToggled(atId: update.0)
}
}).debug("new nodes", trimOutput: false)
我有一些主题将切换事件映射到具有 nodeIdentifier 和更新操作的元组(使用带有每个更新类型案例的枚举)
nodes 是我驱动 tableview 的主要输出。我combineLatest'd nodesFromService(来自服务/api 的原始节点)。
现在,我收到 [Node] 的事件,其中 toggled 属性如下所示:[false, true, true, true, true]。所以它总是来自false -> true,因为combineLatest 总是从nodesFromService 获取初始节点数组。
这就是让我发疯的原因。无论我以哪种方式分割它,这都是一种周期性依赖。我真正需要的是将updates(切换事件)与"final nodes" 流(实际记住更新的流)结合起来。但是,如果我什至能够做到这一点,我就会遇到递归情况。因为updates 是首先产生"final nodes" 流的原因!我感到完全迷失了。我非常感谢这里的帮助。
【问题讨论】: