ios - 如何使用组合框架 NSObject.KeyValueObservingPublisher?
问题描述
我正在尝试使用组合框架 NSObject.KeyValueObservingPublisher。publisher(for:options:)
我可以通过调用NSObject来了解如何生成此发布者。但我有两个问题:
我可以包含
.old
在 中options
,但没有任何.old
价值到达。唯一出现的值是.initial
值(当我们订阅时)和.new
值(每次观察到的属性发生变化时)。我可以抑制该.initial
值,但不能抑制该.new
值或添加该.old
值。如果
options
是[.initial, .new]
(默认值),我无法区分我收到的值是.initial
还是.new
. 使用“真实”KVO,我得到一个 NSKeyValueChangeKey 或一个 NSKeyValueObservedChange,它告诉我我得到了什么。但是对于联合出版商,我不知道。我只是得到未标记的值。
在我看来,这些限制使这个发布者几乎无法使用,除非在最简单的情况下。有什么解决方法吗?
解决方案
我没有太多要添加到 TylerTheCompiler 的答案,但我想注意几点:
根据我的测试,
NSObject.KeyValueObservingPublisher
内部不使用更改字典。它总是使用键路径来获取属性的值。如果您通过
.prior
,则发布者将在每次属性更改时分别发布之前和之后的值。获取属性之前和之后值的更短的方法是使用
scan
运算符:extension Publisher { func withPriorValue() -> AnyPublisher<(prior: Output?, new: Output), Failure> { return self .scan((prior: Output?.none, new: Output?.none)) { (prior: $0.new, new: $1) } .map { (prior: $0.0, new: $0.1!) } .eraseToAnyPublisher() } }
如果您还使用
.initial
,那么 的第一个输出withPriorValue
将是(prior: nil, new: currentValue)
。
推荐阅读
- angular - 如何在角度 7 中将复选框选择限制为最多 3 个
- machine-learning - 在 GCP 上使用 Google Cloud Storage 上的数据创建聊天机器人
- angular - ngb-tab 动态启用后选择选项卡
- python - Django 管理站点不选择当前图像 URL
- python - 测量python asyncio任务压力
- c# - NSubstitute ForPartsOf...当调用真实方法时
- c# - Spaceflight 模拟器如何预测飞行路径?
- javascript - 如何在不重新渲染组件的情况下更改 useState 的状态,而只是重新渲染其组件
- apache - 如何使用 Docker 和 Docker Compose 设置 Magento 1.9
- python - 排序 X 轴的 Python Pandas 箱形图 - 月