【发布时间】:2020-09-09 13:36:48
【问题描述】:
我正在开发一个采用 MVVM 模式的 iOS 应用程序,使用 SwiftUI 设计视图并使用 Swift Combine 将我的视图与它们各自的视图模型粘合在一起。
在我的一个 ViewModel 中,我为按下按钮创建了一个 Publisher(类型为 Void),为一个 TextField(类型为 String)的内容创建了另一个。
我希望能够在我的 ViewModel 中组合两个发布者,这样组合的发布者只在按钮发布者发出事件时发出事件,同时从字符串发布者那里获取最新事件,所以我可以对 @ 进行某种评估987654329@数据,每次用户按下按钮。所以我的虚拟机看起来像这样:
import Combine
import Foundation
public class MyViewModel: ObservableObject {
@Published var textFieldContent: String? = nil
@Published var buttonPressed: ()
init() {
// Combine `$textFieldContent` and `$buttonPressed` for evaulation of textFieldContent upon every button press...
}
}
两个发布者都被 SwiftUI 填充了数据,所以我将省略这部分,让我们假设两个发布者随着时间的推移都会收到一些数据。
来自 RxSwift 框架,我的 goto 解决方案将是 withLatestFrom 运算符来组合两个可观察对象。 但是,在“组合来自多个发布者的元素”部分中深入研究 Publisher 的 Apple 文档,我找不到类似的东西,所以我希望目前缺少这种运算符。
所以我的问题是:是否可以使用 Combine Framework 的现有 operator-API 最终获得与 withLatestFrom 相同的行为?
【问题讨论】:
-
我不知道 RxSwift,所以我不知道
withLatestFrom做了什么。想要的功能是什么?您可能想要combineLatest或zip,但这取决于您想要做什么。请参阅apeth.com/UnderstandingCombine/operators/operatorsJoiners/…如果这些都不能按预期开箱即用,请修改问题以说明它们有什么问题,我们可以添加一个修复它的运算符。 -
不幸的是,
combineLatest和zip都不能满足我的要求,因为withLatestFrom确保生成的流仅在第一个流(在我的示例中单击按钮)发出时才发出事件事件并从第二个流中获取最新事件。combineLatest在每个流的每次最新发射时发射事件,并且 zip 等待两个流发射新事件。 -
根据this 没有等价物。
-
@sweeper 感谢您的来源,这很有帮助。我在想也许可以将现有的运算符组合起来以实现相同的行为。因为我最近经常使用
withLatestFrom,所以我很确定这对很多联合用户来说会有很大的好处。 -
好的,感谢您的澄清。不用担心!我所做的是附加另一个运算符来消除“重复”,其中重复被定义为未更改的对的有问题的成员。这样一来,只有变化才会出现。如果您要经常这样做,很容易制作一个自定义运算符来表达这样的组合。