gpt4 book ai didi

swift - Swift 中的 `Combine` 和 `didSet` 有什么区别?

转载 作者:行者123 更新时间:2023-12-05 01:50:04 24 4
gpt4 key购买 nike

我最近在研究 SwiftUI 并开始以声明方式编写代码。但是这里出现了困惑。如下所示,在 song 被分配给任何值后,我想 (1) 加载歌曲数据和 (2) 通过设置 isInfoViewShown 显示 View 。

我假设 didSet{}Combine @Published .sink{} 可以互换。所以我想问一下它们之间有什么区别?在我看来,didSet{} 可以完成 Combine 所做的大部分工作。那么,Apple 为什么要宣布 Combine 框架呢?

感谢任何帮助。

class InfoViewModel: ObservableObject {

@Published var song: Song? {
didSet { // Here's the didSet{}: [1] load song data
if let song = song {
load(song: song)
}
}
}

private var songSelectedSubscription: AnyCancellable?

@Published var isInfoViewShown: Bool = false

init() { // Here's the Combine @Published .sink{}: [2] show the view
songSelectedSubscription = $song.sink{ self.isInfoViewShown = ($0 == nil ? false : true) }
}
}

最佳答案

当然,有很多方法可以观察到数据的变化,KVO、通知中心、didSet、combine 等,所以从某种意义上说,这些东西确实很相似。不同之处在于:

一个属性只能有一个 didSet,这使得任意数量的观察者都很难注册对该属性的兴趣。

但 Combine 的最大优势是:Combine 管道允许您轻松创建流,例如,将更改流转换为以下流:观察用户输入字符串的变化,对其进行去抖动(速率限制更改,这样我们就不会向服务器发送垃圾邮件),过滤这些更改以获得至少 3 个字符长的任何值,并生成一个您可以观察到的新流。 Map/FlatMap 也是一个非常重要的组合运算符,将 a 的流转换为 b 的流。还将两个流与 combineLatest 等合并在一起,因此您可以获取 a 流和 b 流并制作 (a, b) 流,然后将其映射到经过验证的 c 流。

关于swift - Swift 中的 `Combine` 和 `didSet` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73459298/

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