swift - 在不运行组合管道的情况下更新属性
问题描述
如果我有一个组合管道,可以打印对数组的更改,那么是否可以在不运行管道的情况下更新该数组?
class ObserveableTest: ObservableObject {
private var cancellables: Set<AnyCancellable> = []
@Published var items: [Int] = []
init() {
$items
.debounce(for: 0.6, scheduler: RunLoop.main)
.sink {
print($0)
}
.store(in: &cancellables)
}
func pleaseDoNotNotifyPipeline() {
items.append(1)
}
}
更新: 提供的代码是我工作的简化版本。简而言之,我在篮子管理器上工作,每当用户更改产品的数量(或以另一种方式更改篮子)时,都需要向后端发送请求,为什么会出现去抖动。在上面的代码中,它只是简单地显示了对数组的更改。
情况是,用户对购物篮所做的更改应该运行管道,但是,也可能是系统(来自网络响应等)更新本地购物篮本身,在这种情况下管道应该不跑。
我担心在极少数情况下取消和重新订阅管道可能意味着用户的更改会丢失。但我也可能意识到取消/重新订阅是唯一的解决方案,我需要处理这种罕见的情况。或者你现在看到我已经详细阐述的其他解决方案了吗?
解决方案
我不知道pause
合并中的功能。您指向订阅的指针是返回的AnyCancellable
.
您添加了一个debounce
. 我很好奇您是否想忽略第一个值(在您的情况下为空数组)。为此,您可以.dropFirst()
在管道中使用。
否则,我认为您必须在 mutating 之前取消并重新订阅items
。
class Test: ObservableObject {
private var cancellable: AnyCancellable?
@Published var items: [Int] = []
init() {
observe()
}
func pleaseDoNotNotifyPipeline() {
cancel()
items.append(1)
observe()
}
func cancel() {
cancellable?.cancel()
}
func observe() {
cancellable = $items
.dropFirst() // ignores the first value []
.sink {
print($0)
}
}
}
推荐阅读
- jekyll - 将变量传递到 for 循环中 - 不起作用
- jquery - Jquery 仅显示所选选项之一 + 必需
- python - 如何在 pandas 中使用 API Endpoint 下载 .csv 文件
- android - 如何只通知一次不同片段中的 liveData 更改?
- r - 如何使用 R 中的循环创建具有某些条件的虚拟变量?
- c++ - 从数组指针中获取奇怪的数字
- php - 我可以从 PHP 脚本运行 PHPUnit 测试吗?
- ios - 如何使 UILabel 动态化?
- javascript - 如何将文件内容加载到 ace 编辑器
- c# - 有没有什么客户端控件是ASP.NET?