我正在研究 SwiftUI 应用程序中的状态恢复。我从 Apple 找到了这个示例代码,它使用 ObservableObject 并在对象发生变化时将导航数据存储在 SceneStorage 中。
我想知道如何使用 Observable 类(iOS 17 中的宏)最好地解决这个问题。我会通过使用所需属性的 .values 流来重建它,还是有更聪明的方法。这是我引用的代码片段:
// In Navigation: ObservableObject
var objectWillChangeSequence: AsyncPublisher<Publishers.Buffer<ObservableObjectPublisher>> {
objectWillChange
.buffer(size: 1, prefetch: .byRequest, whenFull: .dropOldest)
.values
}
// In View
.task {
if let data = data {
navModel.jsonData = data
}
for await _ in navModel.objectWillChangeSequence {
data = navModel.jsonData
}
}
鉴于我的导航模型有多个导航路径,理论上我可以使用
pathOne.values
构建一个流,并将Latest 与 pathTwo.values
结合使用,但我想知道是否有更直接的方法。当然,我知道理论上我仍然可以像示例代码一样使用 ObservableObject,但如果可行的话我宁愿使用新的 Observable 宏。
我认为Apple示例没有正确的数据流或数据类型,但这应该可以实现您的要求:
.task {
let stream = AsyncStream {
await withCheckedContinuation { continuation in
let _ = withObservationTracking { // let _ required to fix compilation error
navModel.jsonData
} onChange: {
continuation.resume()
}
}
return navModel.jsonData
}
// initial value
data = navModel.jsonData
// updates
for await jsonData in stream {
data = jsonData
}
}